使用Python requests库爬取网页时本地返回内容缺失目标元素如何解决
问题原因与解决方案
核心原因
你遇到的目标元素丢失问题,90%以上的概率是目标内容为JavaScript动态渲染生成:requests只能获取页面最初的静态HTML源码,不会像浏览器一样执行页面内嵌的JS代码,因此JS生成的元素不会出现在你拿到的html文本中,更换UA和基础headers自然无法解决问题。
排查步骤
- 先在浏览器中打开目标页面,右键点击「查看网页源代码」,直接在源代码中搜索你要抓取的目标元素内容:
- 如果能搜到:说明是反爬规则触发、请求头不全或者内容在iframe嵌套页中
- 如果搜不到:完全确认是JS动态渲染导致
适配原生库的解决方案
因为你只能使用Python原生相关库,可按优先级选择以下方案:
方案1:直接请求数据接口(最优)
动态渲染的内容绝大多数是页面通过AJAX请求后端接口拿到数据后生成的,你可以直接抓对应接口获取数据:
- 打开浏览器F12开发者工具,切换到「网络」面板,刷新页面后筛选「XHR/ Fetch」类型的请求
- 逐个查看请求的响应内容,找到包含你需要的目标数据的接口
- 模拟请求该接口即可,不需要解析HTML,效率更高
参考代码:
import requests # 替换为你抓到的真实数据接口地址 api_url = "你抓到的接口地址" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0', # 补充浏览器中该接口请求带的其他必要头,比如Referer、Cookie、自定义token字段等 } # 接口一般返回JSON格式,直接解析即可 data = requests.get(api_url, headers=headers).json()
方案2:补全请求头/处理iframe
如果排查后确认内容在静态源码中,只是没拿到完整页面:
- 把浏览器中对应页面请求的所有请求头全部复制到你的headers参数中,逐个删除测试,找出必须的请求字段(常见缺失的是Referer、Cookie字段)
- 检查页面是否有iframe标签,你要的内容如果在iframe中,需要单独请求iframe的src属性对应的地址
方案3:内置库调用本地浏览器渲染(极端情况)
如果必须要渲染JS且不能用第三方工具,可以用Python内置的subprocess调用系统自带的浏览器无头模式执行页面后拿完整源码,不过兼容性较低,优先选前两种方案。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

