HTTP/2和Python的支持现状-2019-10
背景:
大概2019年9月份,天猫全面升级了HTTP/2的支持,并且加强了HTTP/1的访问限制,也可能很早前就这么做了,
但之前一直没限制HTTP/1的访问。之所以发现这个问题,是因为写的爬虫突然失败率奇高,而且是间断性被封禁。当
被封禁的时候,使用Chrome浏览器报错为:ERR_SPDY_PROTOCOL_ERROR。休息个不到一分钟,就又可以正常访问。
于是开始分别使用HTTP/2和HTTP/1来测试,发现HTTP/2的爬取顺畅无比,HTTP/1几下就挂了。
原因搞清楚了,下面该是解决问题的时候了。
爬虫下载使用了Python的requests库,google一番发现requests并不支持HTTP/2。可能大神很忙,没工夫
维护了。于是再次使用google大法,找到了hyper库,一个纯Python的HTTP/2客户端。
https://github.com/python-hyper/hyper
官方文档:https://hyper.readthedocs.io/en/latest/
本来用惯了requests,突然换hyper感觉不太适应,没想到作者很贴心的提供了requests的支持:Requests Integration。
先赞一个!!!
本以为问题到此结束,代码小改一下就完事,没想到的是,前 方 还 有 很 多 坑。。。
第一个坑(不支持代理):
hyper目前在PYPI上最新版本为hyper 0.7.0,竟然不支持代理。WTF,如果不支持代理,要你何用???

瞅了一眼github仓库的提交时间,发现最后提交是 3年前,看来这位大神最近也很忙,没工夫搞这个了。(估计是当
时HTTP/2客户端没啥需求)本以为,要花费整个国庆假期,不知道要死多少脑细胞才能把这个坑给填上的我,在又
google了一天之后突然发现,在这个github仓库的development分支上,有人已经填坑了:
https://github.com/python-hyper/hyper/pull/322
感谢 @KostyaEsmukov
于是,代理的问题解决,然后看下一个坑。
第二个坑(内存泄漏严重):
由于采集量太大,为了提高效率,爬虫采用了gevent+requests的并发架构。本来就有一些内存泄漏的现象,一
直没找到原因,不过还好不是很严重,也就没管。只是没想到,使用development版hyper之后, 内存泄漏的速度一
下提升了很多很多倍,以前一天重启一次的容器,现在要1小时不到就得重启,短期没啥事,但这个问题总归还是得解决
的。
本来不想放弃的requests,最后还是被我放弃了。在同事的提醒下,尝试了使用pycurl这个封装了libcurl的下
载库。发现libcurl果然强大,HTTP2甚至HTTP3都支持了,代理支持没问题,内存泄漏也没问题。
pycurl文档:http://pycurl.io/docs/latest/ (吐槽一下:易用性跟requests比起来简直就是天上地下)
然而貌似很美好的事情,却总是各种意外打破。pycurl是调用的C语言写好的库,而我用了gevent来实先并发,在
gevent+C语言的环境下,gevent就是个废材。为了修复内存泄漏,而放弃并发。这个代价太高了。。。。。。
好在天无绝人之路,google大法的使用下,又被我找到了一个把gevent和pycurl结合起来的办法:
https://bitbucket.org/denis/gevent-curl/src/default/
不过这个源码在最新版本的gevent下无法运行,修复后的版本在这里:
https://github.com/dytttf/gevent-pycurl
完结撒花。。。。
下面分享一下google过程中收集的一些关于HTTP/2的资料:
一位WEB端牛人的博客
其他资料:
HTTP/2 呼之欲出,Google 不再开发 SPDY 哈哈 4年前的文章 感觉跟不上时代了
HTTP/2和Python的支持现状-2019-10的更多相关文章
- 如何让你的Python程序支持多语言
如何让你的Python程序支持多语言 本文介绍如何通过Python标准库gettext帮助你的程序支持多语言. 代码例子 import random guessesTaken = 0 print(_( ...
- 通过数据分析告诉你北京Python开发的现状
相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平.招聘要求.福利待遇以及公司地理位置.既然要分析那必然是现有数据样本.本文通过爬虫和数据分析为大家展示一下北京Py ...
- 让python cookie支持特殊字符
让python cookie支持特殊字符 先对cookie做下简单的介绍 cookie的作用: tcp协议能够通过三次握手建立连接.client发送的多次请求能够通过句柄维护同一个连接.可是http协 ...
- 如何让python脚本支持命令行参数--getopt和click模块
一.如何让python脚本支持命令行参数 1.使用click模块 如何使用这个模块,在我前面的博客已经写过了,可参考:https://www.cnblogs.com/Zzbj/p/11309130.h ...
- 使用Python抓取猫眼近10万条评论并分析
<一出好戏>讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何? 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演 ...
- 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10
孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...
- TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器
TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器 任务清单 给自己取一个酷酷的id,并选择1-2个喜欢的方向.(只是初步选择,后期可更改) 改下群名片.例如yo ...
- Python练习题 027:对10个数字进行排序
[Python练习题 027] 对10个数字进行排序 --------------------------------------------- 这题没什么好说的,用 str.split(' ') 获 ...
- ArcGIS图框工具5.2发布,支持ArcGIS10.0,10.110.2,支持国家2000坐标系
ArcGIS图框工具5.2发布,支持ArcGIS10.0,10.110.2,支持国家2000坐标系 下载地址http://files.cnblogs.com/gisoracle/atktoolnew. ...
随机推荐
- Linux下进程间通信方式——使用消息队列
一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的 ...
- 网络协议 17 - HTTPDNS
全球统一的 DNS 是很权威,但是我们都知道“适合自己的,才是最好的”.很多时候,标准统一化的 DNS 并不能满足我们定制的需求,这个时候就需要 HTTPDNS 了. 上一节我们知道了 DNS ...
- [Gamma] 项目展示
[Gamma] 项目展示 一.工程展示 1.项目简介 定位分析 我们的目标是做一个创意分享网站,在之前的阶段中完成了大框架的搭建,并以此为基础进行界面优化与功能扩展. 典型用户 用户 面临困境 需求功 ...
- Maven 教程(9)— Maven坐标详解
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79544532 Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种j ...
- Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)
在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着 ...
- django 中进程监控工具flower的使用
工程结构:请参考https://www.cnblogs.com/apple2016/p/11425307.html flower官方文档:https://flower.readthedocs.io/e ...
- centos 7 下 rabbitmq 3.8.0 & erlang 22.1 源码编译安装
centos 7 下 rabbitmq 3.8.0 & erlang 22.1 源码编译安装 安装前请检查好erlang和rabbitmq版本是否相匹配参考:RabbitMQ Erlang V ...
- [转帖]Helm 3 使用 harbor 作为仓库存储 charts
Helm 3 使用 harbor 作为仓库存储 charts https://www.cnblogs.com/innerpeacez/p/11252198.html 之前需要 使用tiller 现在貌 ...
- [转帖]Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案
Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案 https://www.cnblogs.com/xlecho/p/11834011.html echo编辑整理,欢迎转载,转 ...
- python面试导航
python面试题库 python基础 等待更新中 函数 等待更新中 面向对象 等待更新中 高级编程 等待更新中 数据库 等待更新中 前端&django 等待更新中 crm 等待更新中 drf ...