千家信息网

Python怎么禁用request库请求

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"Python怎么禁用request库请求"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2026年11月02日Python怎么禁用request库请求

本篇内容介绍了"Python怎么禁用request库请求"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、前言

一个非常强的反爬虫方案 -- 禁用所有 HTTP 1.x 的请求!

现在很多爬虫库其实对 HTTP/2.0 支持得不好,比如大名鼎鼎的 Python 库 -- requests,到现在为止还只支持 HTTP/1.1,啥时候支持 HTTP/2.0 还不知道。

Scrapy 框架最新版本 2.5.0(2021.04.06 发布)加入了对 HTTP/2.0 的支持,但是官网明确提示,现在是实验性的功能,不推荐用到生产环境,原文如下:

"

HTTP/2 support in Scrapy is experimental, and not yet recommended for production environments. Future Scrapy versions may introduce related changes without a deprecation period or warning.

"

插一句,Scrapy 中怎么支持 HTTP/2.0 呢?在 settings.py 里面换一下 Download Handlers 即可:

DOWNLOAD_HANDLERS = {    'https': 'scrapy.core.downloader.handlers.http2.H2DownloadHandler',}

当前 Scrapy 的 HTTP/2.0 实现的已知限制包括:

  • 不支持 HTTP/2.0 明文(h3c),因为没有主流浏览器支持未加密的 HTTP/2.0。

  • 没有用于指定最大帧大小大于默认值 16384 的设置,发送更大帧的服务器的连接将失败。

  • 不支持服务器推送。

  • 不支持bytes_received和 headers_received信号。

关于其他的一些库,也不必多说了,对 HTTP/2.0 的支持也不好,目前对 HTTP/2.0 支持得还可以的有 hyper 和 httpx,后者更加简单易用一些。

二、反爬虫

所以,你想到反爬虫方案了吗?

如果我们禁用所有的 HTTP/1.x 的请求,是不是能通杀掉一大半爬虫?requests 没法用了,Scrapy 除非升级到最新版本才能勉强用个实验性版本,其他的语言也不用多说,也会杀一大部分。

而浏览器对 HTTP/2.0 的支持现在已经很好了,所以不会影响用户浏览网页的体验。

三、措施

那就让我们来吧!

这个怎么做呢?其实很简单,在 Nginx 里面配置一下就好了,主要就是加这么个判断就行了:

if ($server_protocol !~* "HTTP/2.0") {  return 444;}

就是这么简单,这里 $server_protocol 就是传输协议,其结果目前有三个:HTTP/1.0、HTTP/1.1 和 HTTP/2.0,另外判断条件我们使用了 !~* ,意思就是不等于,这里的判断条件就是,如果不是 HTTP/2.0,那就直接返回 444 状态码,444 一般代表 CONNECTION CLOSED WITHOUT RESPONSE,就是不返回任何结果关闭连接。

我的服务是在 Kubernetes 里面运行的,所以要加这个配置还得改下 Nginx Ingress 的配置,不过还好 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/ 预留了一个配置叫做 nginx.ingress.kubernetes.io/server-snippet,利用它我们可以自定义 Nginx 的判定逻辑。

官方用法如下:

apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/server-snippet: |        set $agentflag 0;        if ($http_user_agent ~* "(Mobile)" ){          set $agentflag 1;        }        if ( $agentflag = 1 ) {          return 301 https://m.example.com;        }

所以这里,我们只需要改成刚才的配置就好了:

apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/server-snippet: |      if ($server_protocol !~* "HTTP/2.0") {        return 444;      }

大功告成!

配置完成了,示例网站是:https://spa16.scrape.center/

我们在浏览器中看下效果:

可以看到所有请求都是走的 HTTP/2.0,页面完全正常加载。

然而,我们使用 requests 来请求一下:

import requestsresponse = requests.get('https://spa16.scrape.center/')print(response.text)

非常欢乐的报错:

Traceback (most recent call last):  ...    raise RemoteDisconnected("Remote end closed connection without"http.client.RemoteDisconnected: Remote end closed connection without response During handling of the above exception, another exception occurred: Traceback (most recent call last):  ...    raise MaxRetryError(_pool, url, error or ResponseError(cause))requests.packages.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='spa16.scrape.center', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response'))) During handling of the above exception, another exception occurred: Traceback (most recent call last): ...requests.exceptions.ProxyError: HTTPSConnectionPool(host='spa16.scrape.center', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))

如果你用 requests,无论如何都不行的,因为它就不支持 HTTP/2.0。

那我们换一个支持 HTTP/2.0 的库呢?比如 httpx,安装方法如下:

pip3 install 'httpx[http2]'

注意,Python 版本需要在 3.6 及以上才能用 httpx。

安装好了之后测试下:

import httpxclient = httpx.Client(http2=True) response = client.get('https://spa16.scrape.center/')print(response.text)

结果如下:

Scrape | Book

可以看到,HTML 就成功被我们获取到了!这就是 HTTP/2.0 的魔法!

我们如果把 http2 参数设置为 False 呢?

import httpxclient = httpx.Client(http2=False) response = client.get('https://spa16.scrape.center/')print(response.text)

一样很不幸:

Traceback (most recent call last): ...    raise RemoteProtocolError(msg)httpcore.RemoteProtocolError: Server disconnected without sending a response. The above exception was the direct cause of the following exception:  ...    raise mapped_exc(message) from exchttpx.RemoteProtocolError: Server disconnected without sending a response.

所以,这就印证了,只要 HTTP/1.x 通通没法治!可以给 requests 烧香了!

"Python怎么禁用request库请求"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

支持 就是 配置 爬虫 版本 浏览 浏览器 结果 服务 不好 内容 实验性 方案 更多 服务器 条件 知识 网站 实验 不行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 云之行互联网科技 互联网金融 金融科技 奇酷互联网科技公司 金融科技和互联网金融 互联网科技寓意 湖南一路畅行互联网科技 互联网科技产业特征 朱啸虎曾投资哪些互联网科技企业 南博望互联网科技有限公司 梅州GM互联网络科技有限公司 下一代互联网重大应用科技园 神州科技互联网有限公司 广州梦谷互联网科技有限公司领导 互联网公司属于科技吗 中国科技和美国互联网 陕西彩京云互联网科技有限公司 互联网领先科技成果宣传视频 东风日产互联网科技公司叫什么 互联网大会出现的黑科技 科技互联网政务服务 朗涯互联网科技 大白互联网科技 互联网科技宣传片 中国最先进互联网科技公司 智腾互联网科技有限公司 和信科技工业互联网 南京一网一红互联网科技有限公司 银川新华互联网科技学校原画 盐城市攀科互联网科技有限公司
0