如何使用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
相关产品推荐
相关产品推荐

