导致此错误的 HTTPX 和 python 中的 requests 模块有什么区别

Sun*_*uni 11 python http python-requests

没什么好说的,我正在向某个网址发送请求。一台 HTTP 客户端返回 403,一台成功。标头没有区别。还有什么不同?

>>> print(httpx.get(url).status_code)
200
>>> print(requests.get(url).status_code)
403
Run Code Online (Sandbox Code Playgroud)

Sla*_*apy 11

我的猜测是该网站正在阻止来自请求库的请求。

这怎么可能?

对于每个请求,您都会留下发出请求的设备的指纹。该指纹除其他信息外还包含user-agent

当您使用 requests 库执行请求时,默认用户代理值设置为“python-requests/2.28.0”之类的内容,而对于 httpx 库,则设置为“python-httpx/0.23.0”之类的内容。

根据您的指纹中包含的信息,网站可能会选择以不同于其他人的方式处理您的请求。例如返回错误页面而不是真实内容。

但为什么?

Python 经常用于网络抓取,而 requests 是更流行的库之一。很多人会选择在自己的项目中使用它。因此,许多网站选择不向使用“python-requests/*”用户代理的请求提供真实内容。

由于处理请求需要花钱,因此网站试图只向真人而不是机器人提供内容。与真人相比,机器人流量也往往要大得多。虽然有些人只是想禁止第三方以他们不喜欢或不知道的方式使用他们的内容。

Httpx 库也在做同样的事情,但它不像 requests 库那样广为人知,因此您会发现更多不阻止此类请求的网站。

是否可以绕过封锁?

是的,有很多关于该主题的在线资源。只需搜索“避免请求阻塞”之类的内容即可。

  • 两者之间的区别在于 SSL 密码套件。请求模块实现了一些在该网站上不起作用的密码套件。在某些旧版本中,我不太记得了,但我记得经历了大约 60 个版本,检查了影响密码套件更改的每个提交,结果发现这就是问题所在。 (6认同)