【问题标题】:get request returns 403 status code even after using header即使使用标头,get 请求也会返回 403 状态码
【发布时间】:2021-02-12 08:53:42
【问题描述】:

我正在尝试从 autotrader 页面抓取数据,并且我设法获取了指向该页面上每个报价的链接,但是当我尝试从每个报价中获取数据时,即使我使用的是标题,我也会收到 403 请求状态. 我还能做些什么来克服它?

headers = {"User Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
                     'Chrome/85.0.4183.121 Safari/537.36'}
page = requests.get("https://www.autotrader.co.uk/car-details/202010145012219", headers=headers)
print(page.status_code) # 403 forbidden
content_of_page = page.content
soup = bs4.BeautifulSoup(content_of_page, 'lxml')
title = soup.find('h1', {'class': 'advert-heading__title atc-type-insignia atc-type-insignia--medium '})
print(title.text)

[对于处于相同位置的人:autotrader 使用 cloudflare 来保护每个“汽车详细信息”页面,因此我建议使用 selenium 为例]

【问题讨论】:

    标签: python python-requests request-headers


    【解决方案1】:

    如果您可以设法通过浏览器获取数据,即您以某种方式在网站中看到此数据,那么您可能会通过请求复制这些数据。

    简而言之,您的请求中需要标头以匹配浏览器的请求:

    • 在浏览器中打开开发工具(例如 F12 或 cmd+opt+I 或单击菜单)
    • 打开网络标签
    • 重新加载页面(整个网站或目标请求的 url,无论是从服务器提供所需响应的任何内容)
    • 在“网络”选项卡中找到对所需 URL 的 http 请求。右键单击它,单击“复制...”,然后选择您需要的选项(例如 curl)。

    您的浏览器会发送大量额外的标头,您永远不知道服务器实际检查了哪些标头,因此这种技术将为您节省大量时间。

    但是,如果有一些针对钝请求副本的保护措施,例如,这可能会失败。一些临时令牌,因此无法重用请求。在这种情况下,您需要Selenium(浏览器仿真/自动化),它并不难,因此值得使用。

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2023-01-29
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多