【问题标题】:Python Requests returning different HTML values from browser occasionallyPython 请求偶尔从浏览器返回不同的 HTML 值
【发布时间】:2023-02-17 02:43:24
【问题描述】:

我正在尝试访问项目的https://www.hellofresh.com/menus 上加载的数据,这可以通过使用以下端点作为模板重建 API 端点来完成:https://www.hellofresh.com/_next/data/1.964.0/menus/2023-W01.json

我认为“1.964.0”是与 next.js 相关的某种内部版本号,“2023-W01”是返回特定一周膳食的密钥。因为“1.964.0”字符串是随机增加的,所以我通过菜单页HTML中的head标签查找最新的一个,存在为<meta content="1.964.0" property="version">

但是,当使用 Python Requests 自动执行此字符串查找时,我有时会在运行脚本几次后得到不正确的旧字符串。在此示例中,它返回“1.961.0”,并且将该字符串放入端点不起作用。换句话说,我在浏览器中看到的 HTML 与 Python 中的 GET 请求提供的 HTML 之间存在差异。

奇怪的是,如果我多次重新运行请求脚本,它最终会得到正确的数字字符串(例如:1.964.0)并且没有问题,并且在没有对脚本进行任何更改的情况下发生这种情况。除了user-agentrefereraccept标头之外,我还尝试使用cache-control: no-cachepragma: no-cache标头发送请求,无论标头组合如何,行为都是相同的。在这一点上我真的很抓狂,所以任何指向任何答案的东西都非常感谢。

【问题讨论】:

    标签: python html web-scraping next.js python-requests


    【解决方案1】:

    服务器可能正在使用某种缓存机制或负载平衡,导致 Python 中 GET 请求提供的 HTML 与您在浏览器中看到的 HTML 之间存在差异。

    解决此问题的一种方法是比较服务器为 Python 请求和浏览器请求返回的响应标头。这有助于识别可能导致问题的缓存行为或其他服务器端设置的任何差异。

    您可以使用响应对象的 headers 属性打印出 Python Requests 中的响应标头,如下所示:

    import requests
    
    response = requests.get('https://www.hellofresh.com/menus')
    print(response.headers)
    

    您还可以在浏览器的开发人员工具中查看响应标头。例如,在 Google Chrome 中,您可以按 F12 打开开发者工具,然后转到“网络”选项卡以查看请求的响应标头。

    获得两个请求的响应标头后,比较它们以查看是否存在任何差异。查找与缓存相关的标头,例如 Cache-Control、Expires 和 Last-Modified,以及与内容编码和压缩相关的标头,例如 Content-Encoding 和 Content-Length。

    如果您发现响应标头有任何差异,您可以尝试在 Python 请求中设置相同的标头以匹配浏览器请求,看看是否能解决问题。

    另一种可能性是服务器根据某些标准(例如 User-Agent 标头或请求频率)限制或阻止您的 Python 请求。您可以尝试设置不同的 User-Agent 标头或在请求之间添加延迟以查看是否有帮助。

    尝试使用像 Selenium 这样的无头浏览器或像 Scrapy 这样的抓取框架来自动抓取。这些工具可以模拟浏览器环境,并且不太可能遇到服务器端缓存或速率限制问题。

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多