为什么我在使用 python 抓取时会收到 403 Forbidden 错误?

Dom*_*vic 4 python http request web-scraping python-requests

我正在尝试抓取某个网站,我们将其称为“https://some-website.com”。在过去的几个月里,我能够毫无问题地做到这一点,但几天前我注意到抓取工具不再工作,因为所有请求都返回 403 禁止状态。

在过去的三个月里,我使用下面的代码来抓取数据。

import requests
from fake_useragent import UserAgent

res = requests.get(<url>, headers={'User-Agent': UserAgent().random})
Run Code Online (Sandbox Code Playgroud)

这总是返回一个很好的 200 OK 和我需要的页面。直到几天前,我开始收到 403 Forbidden 错误。在返回文本中的某处,我可以发现一句话“启用 JavaScript 和 cookies 以继续”

用户代理问题

正如您在代码中看到的,我已经随机切换了用户代理标头,这通常是解决此类问题的建议。

知识产权问题

当然,我怀疑他们将我的 IP 列入黑名单(可能与某些用户代理结合使用,不允许我抓取)。然而,我实现了一个使用代理的解决方案,但仍然得到 403。

import requests
from fake_useragent import UserAgent

proxies = {
   "https": f'http://some_legit_proxy',
   "http": f'http://some_legit_proxy',
}

res = requests.get(<url>, headers={'User-Agent': UserAgent().random}, proxies=proxies)
Run Code Online (Sandbox Code Playgroud)

该代理是住宅代理。

基本尝试确实有效

最让我困惑的是,如果我删除随机用户代理部分并使用默认请求用户代理,那么抓取会突然起作用。

import requests

res = requests.get(<url>) # 'User-Agent': 'python-requests/2.28.1'
# 200 OK
Run Code Online (Sandbox Code Playgroud)

这告诉我,这并不意味着网站突然需要 javascript,因为抓取确实有效,只是看起来它们以某种方式阻止了我。

我有一些想法来解决这个问题,但由于我不明白这是如何发生的,所以我无法确定这在未来是否可以扩展。

请帮助我了解这里发生了什么。

小智 5

您可能需要旋转代理或隐藏/绕过设备指纹识别的东西,这些设备指纹识别可能会将您的脚本暴露为机器人。

参考:

Web Unlocker 如何实现更好的指纹识别、自动解锁和验证码解析