Python使用requests.get获取页面时内容加载不全问题求解
核心原因
调整requests.get()的timeout、stream参数无法解决内容缺失问题,本质原因如下:
requests仅能获取服务器直接返回的初始静态HTML响应,本身不具备执行页面JavaScript的能力- 页面加载后期才出现的内容,基本都是初始HTML返回后,由浏览器执行JS脚本、发起异步接口请求后渲染生成的动态内容,这部分内容不会包含在
requests拿到的初始响应体中,和请求等待时长、是否采用流式传输没有关联 - 代码中设置
stream=True反而可能导致内容残缺:该参数作用是让响应不自动完成全量下载,直接调用r.text时如果未读全响应内容,拿到的本身就是不完整的文本,首先要移除这个参数。
可选解决路径
方案1:直接请求动态数据接口(优先选择,性能最优)
- 打开浏览器开发者工具(按F12唤起),切换到「网络」面板,筛选XHR/异步请求类型
- 手动在浏览器访问目标页面,等待所有内容加载完成,在网络请求列表中定位到返回缺失内容的异步接口
- 复用已有的登录态
requests.Session()直接模拟请求对应接口获取数据即可,不需要渲染完整页面,运行速度快、稳定性高。
方案2:使用支持JS渲染的工具获取完整页面
如果动态接口加密逻辑复杂、难以直接模拟,换用可执行JS的爬虫工具,等待页面完全加载后再提取源码:
- 可选工具包括Selenium、Playwright,通过无头模式启动浏览器访问目标页,配置等待逻辑(比如等待指定DOM元素加载完成、设置合理的显式等待时长),待所有内容渲染完毕后再提取完整页面源码保存。
现有代码基础修正
先移除错误的stream参数,保证静态响应内容完整获取,修正后代码如下:
# 用上下文管理器操作文件,自动处理文件关闭逻辑 with open(r'C:\Users\axelg\.spyder-py3\accueil.html', 'w', encoding="utf-8") as acc: with requests.Session() as s: login_entry_url = 'http://localhost/mysiste.php' s.get(login_entry_url) login_data = {'log': 'myLog', 'pwd': 'MyPwd'} # 增加登录结果校验,避免登录失败导致后续页面内容异常 login_resp = s.post(login_entry_url, data=login_data) login_resp.raise_for_status() # 移除stream=True,获取完整静态响应 page_resp = s.get('http://localhost/location/') # 自动识别响应编码,避免乱码 page_resp.encoding = page_resp.apparent_encoding acc.write(page_resp.text)
注意:上述修正仅能保证拿到完整的初始静态HTML,JS异步渲染的动态内容仍无法通过该代码获取,需要配合前面提到的两种方案才能拿到全量页面内容。
内容的提问来源于stack exchange,提问作者Axel Garreau
相关产品推荐
相关产品推荐

