即使使用标头,get请求也返回403状态代码

时间:2020-10-29 20:59:45

标签: python python-requests request-headers

我正在尝试从自动交易器页面中抓取数据,并且设法抓住了该页面上每个报价的链接,但是当我尝试从每个报价中获取数据时,即使我使用的是标头,我也会得到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)

[对于处于相同位置的人:自动交易器使用cloudflare保护每个“汽车详细信息”页面,因此,我建议使用硒)]

1 个答案:

答案 0 :(得分:1)

如果您可以设法通过浏览器获取数据,即以某种方式在网站上看到此数据,则可以通过请求复制该数据。

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

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

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

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