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

如何使用requests-html获取非缓存页面?解决代码随机返回缓存页面的问题

解决requests-html爬取时的缓存问题

我之前也碰到过一模一样的情况——用requests-html请求时偶尔会拿到缓存的错误内容,但浏览器访问却一直显示最新页面。这主要是因为浏览器在处理缓存时会自动发送更完整的请求头,而我们手动设置的头通常不够全面。你可以试试下面这些方法:

  • 补充更严格的缓存禁用头:你当前的Cache-Control头还不够彻底,加上no-store(禁止服务器和本地存储缓存)、must-revalidate(强制验证缓存有效性),再添上Expires头设置为过去的时间,让服务器明确知道你要最新内容:

    from requests_html import HTMLSession
    
    session = HTMLSession()
    headers = {
        "Cache-Control": "no-store, no-cache, must-revalidate, max-age=0",
        "Pragma": "no-cache",
        "Expires": "Thu, 01 Jan 1970 00:00:00 GMT",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0"
    }
    resp = session.get(url, headers=headers)
    
  • 清除Session的Cookies和缓存:部分服务器会根据Cookie返回个性化的缓存内容,每次请求前清除Session的Cookies,避免旧Cookie导致的缓存命中:

    session.cookies.clear()
    resp = session.get(url, headers=headers)
    
  • 添加缓存验证头:给请求加上If-Modified-Since并设置为一个极早的时间,强制服务器忽略缓存,返回最新页面:

    from datetime import datetime
    
    headers["If-Modified-Since"] = datetime(1970, 1, 1).strftime("%a, %d %b %Y %H:%M:%S GMT")
    resp = session.get(url, headers=headers)
    
  • 模拟浏览器渲染(可选):如果目标页面是动态生成的,服务器可能对非浏览器请求返回不同缓存,试试用render()方法模拟真实浏览器加载,这会更接近你手动访问的行为:

    resp = session.get(url, headers=headers)
    resp.html.render()  # 这会启动无头Chrome,确保拿到动态渲染的最新内容
    

这些方法组合起来,基本能解决大部分缓存导致的旧内容问题,让你的请求和浏览器的行为更对齐。

内容的提问来源于stack exchange,提问作者faiuwle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:58:10