问题现象
requests 拿到页面后查找商品列表,find_all 返回空,打印源码只有骨架没有数据。
原因分析
目标内容由前端脚本请求接口后渲染,静态 HTML 里没有对应节点。判断时先分清是 BeautifulSoup 抓不到数据 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。
处理步骤
- 先在源码里搜索关键字确认是否存在
- 找到真实数据接口直接请求 JSON
- 确实需要渲染时再用浏览器内核
对应的命令或配置片段如下,可直接复制:
import requests
r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=20)
print('关键字在源码中:', 'price' in r.text)
# 找到接口后
# data = requests.get(api, headers=hd).json()
改动前把原配置备份一份,出问题时能马上回退,比现场找原因省时间。排查时把每一步的输出留下来,后面再遇到同类问题,对照日志就能判断是哪一层先出错的。
验证结果
接口返回的 JSON 里能解析出需要的字段,数量与页面显示一致。