织梦网站模板源码,wordpress标签球形,怎么弄网站关键词,阿里云虚拟主机可以做两个网站不碰网页 HTML#xff0c;只扒干净漂亮的 JSON#xff1a;一招走遍天下接口一、为什么选择“只爬 API”返回结构化 JSON#xff0c;省去 DOM 解析烦恼带宽小#xff0c;速率快#xff0c;反爬成本远低于 HTML 页面很多站点 SPA 本身就靠公开 API 渲染#xff0c;不违法也…不碰网页 HTML只扒干净漂亮的 JSON一招走遍天下接口一、为什么选择“只爬 API”返回结构化 JSON省去 DOM 解析烦恼带宽小速率快反爬成本远低于 HTML 页面很多站点 SPA 本身就靠公开 API 渲染不违法也不违规参数可复用一套代码能“薅”多端Web、H5、App二、找接口3 个“一眼定位”技巧1. 浏览器 F12 → Network → XHR/JSON 过滤器刷新页面按 Size 降序优先挑json/api路径2. 搜索关键字全局搜token,sign,t时间戳、appKey快速锁定鉴权参数3. 手机抓包App 接口mitmproxy 夜神模拟器安装系统证书后启动 App 下滑刷新拿到带Content-Type: application/json的请求小技巧把接口curl直接复制到 Postman参数一个不落先跑通再编码三、接口逆向 4 件套名称工具作用参数含义Postman 环境变量去繁就简删掉无关头签名逻辑Chrome 断点 / 解包定位sign md5(stringA key)时间戳Pythontime.time()*1000保证t与服务器误差 30 sToken 有效期响应头Expires/ JWT payload提前 5 分钟刷新四、完整实战某天气 API公开免费版目标按城市编码获取 7 日天气落库 MySQL每日 06:00 自动跑1. 接口信息GET https://api.weather.com/v1/forecast/daily 参数 cityCode101010100 北京 langzh unitm keyYOUR_KEY 免费申请2. 依赖库pip install requests pydantic sqlalchemy pymysql python-dotenv schedule3. 代码可直接python main.py跑# -*- coding: utf-8 -*- import os, time, requests, schedule from datetime import date from typing import List from pydantic import BaseModel, Field from sqlalchemy import create_engine, Column, String, Float, Date from sqlalchemy.orm import declarative_base, sessionmaker # ---------- 1. 配置 ---------- BASE_URL https://api.weather.com/v1/forecast/daily API_KEY os.getenv(WEATHER_KEY) # 写 .env 里 CITY_CODE 101010100 ENGINE create_engine(mysqlpymysql://user:pwdlocalhost:3306/weather?charsetutf8mb4) Session sessionmaker(bindENGINE) Base declarative_base() # ---------- 2. ORM ---------- class Forecast(Base): __tablename__ t_forecast city Column(String(20), primary_keyTrue) f_date Column(Date, primary_keyTrue) max_temp Column(Float) min_temp Column(Float) cond Column(String(20)) # ---------- 3. 数据模型 ---------- class Day(BaseModel): date: date tmp_max: float Field(aliasmax_temp) tmp_min: float Field(aliasmin_temp) cond_txt_d: str Field(aliascond) class Resp(BaseModel): daily: List[Day] # ---------- 4. 抓取 ---------- def crawl(): params {cityCode: CITY_CODE, lang: zh, unit: m, key: API_KEY} r requests.get(BASE_URL, paramsparams, timeout10) r.raise_for_status() return Resp.parse_obj(r.json()).daily # ---------- 5. 落库 ---------- def save(data: List[Day]): with Session() as sess: for d in data: obj Forecast(city北京, f_dated.date, max_tempd.tmp_max, min_tempd.tmp_min, condd.cond_txt_d) sess.merge(obj) # 存在则更新 sess.commit() # ---------- 6. 调度 ---------- def job(): save(crawl()) print(time.strftime(%F %T), 抓取完成) schedule.every().day.at(06:00).do(job) if __name__ __main__: Base.metadata.create_all(ENGINE) # 首次建表 job() # 手动跑一次 while True: schedule.run_pending() time.sleep(1)4. 运行结果2025-04-18 06:00:02 抓取完成 mysql select * from t_forecast limit 2; ---------------------------------------------- | city | f_date | max_temp | min_temp | cond | ---------------------------------------------- | 北京 | 2025-04-18 | 24.0 | 11.0 | 晴 | | 北京 | 2025-04-19 | 26.0 | 13.0 | 多云 | ----------------------------------------------五、进阶带签名的“非公开”接口案例1. 签名规则逆向结果def sign(params: dict, app_secret: str) - str: text .join([f{k}{params[k]} for k in sorted(params)]) f{app_secret} return hashlib.md5(text.encode()).hexdigest().upper()2. 自动刷新 Tokendef get_token() - str: r requests.post(https://x.com/api/refresh, json{refresh: REFRESH}) return r.json()[data][access_token]3. 重试 / 限流 / 降级from tenacity import retry, stop_after_attempt, wait_random retry(stopstop_after_attempt(5), waitwait_random(1, 3)) def fetch_with_sign(params): params[t] int(time.time()*1000) params[sign] sign(params, APP_SECRET) r requests.get(API_URL, paramsparams, headers{Authorization: fBearer {get_token()}}) if r.status_code 429: raise Exception(Rate limit) # 触发重试 r.raise_for_status() return r.json()六、合法与合规红线只采“公开”接口——需要破解加密、拆 App 壳的先让法务评估遵守 robots.txt与《反不正当竞争法》控制频率建议 ≤ 1 QPS不碰个人信息——手机号、身份证、地址一律不落盘设置黑名单——对方返回Retry-After或403立即停爬并告警标注数据来源对内对外报表都加“本数据由××接口抓取仅供参考”七、常见错误速查表异常根因修复401 Unauthorizedtoken 过期自动刷新后再发460 “非法签名”参数顺序/大小写错误打印待签字符串逐字符对比空 JSON{}限流返回兜底体指数退避重试SSLCertVerificationError公司抓包证书冲突verifyFalse 警告过滤八、小结把接口当“免费数据库”的正确姿势先 Postman 跑通 → 2. Python 封装requests→ 3. Pydantic 做模型 → 4. SQLAlchemy 落库 → 5. 调度 重试 监控一条链下来代码 150 行就能让“别人的接口”变成你报表里的实时数据。如遇任何疑问或有进一步的需求请随时与我私信或者评论联系。