You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:45:31