即使在使用 header 之后也得到请求 returns 403 状态码

get request returns 403 status code even after using header

我正在尝试从 autotrader 页面抓取数据,并且设法抓取 link 该页面上的每个报价,但是当我尝试从每个报价中获取数据时,我得到 403 请求状态,尽管我正在使用 header。 我还能做些什么来克服它?

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 来保护每个“car-detail”页面,因此我建议使用 selenium 例如]

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

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

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

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

但是,如果有一些针对直截了当的请求副本的保护措施,这可能会失败,例如一些临时令牌,因此不能重复使用请求。在这种情况下你需要Selenium(浏览器emulation/automation),不难所以值得使用。