背景:

大概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 资料汇总

HTTP/2:新的机遇与挑战     PDF

HTTP 代理原理及实现(一)

其他资料:

一文读懂 HTTP/2 特性

HTTP/2 呼之欲出,Google 不再开发 SPDY    哈哈  4年前的文章  感觉跟不上时代了

Web通信协议,你还需要知道: SPDY 和 QUIC

 
 
 
 
 
 
 
 
 

HTTP/2和Python的支持现状-2019-10的更多相关文章

  1. 如何让你的Python程序支持多语言

    如何让你的Python程序支持多语言 本文介绍如何通过Python标准库gettext帮助你的程序支持多语言. 代码例子 import random guessesTaken = 0 print(_( ...

  2. 通过数据分析告诉你北京Python开发的现状

    相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平.招聘要求.福利待遇以及公司地理位置.既然要分析那必然是现有数据样本.本文通过爬虫和数据分析为大家展示一下北京Py ...

  3. 让python cookie支持特殊字符

    让python cookie支持特殊字符 先对cookie做下简单的介绍 cookie的作用: tcp协议能够通过三次握手建立连接.client发送的多次请求能够通过句柄维护同一个连接.可是http协 ...

  4. 如何让python脚本支持命令行参数--getopt和click模块

    一.如何让python脚本支持命令行参数 1.使用click模块 如何使用这个模块,在我前面的博客已经写过了,可参考:https://www.cnblogs.com/Zzbj/p/11309130.h ...

  5. 使用Python抓取猫眼近10万条评论并分析

    <一出好戏>讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何? 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演 ...

  6. 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10

    孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...

  7. TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器

    TIZ_c 第0周总结(2019/10/15-2019/10/22)工欲善其事必先利其器 任务清单 给自己取一个酷酷的id,并选择1-2个喜欢的方向.(只是初步选择,后期可更改) 改下群名片.例如yo ...

  8. Python练习题 027:对10个数字进行排序

    [Python练习题 027] 对10个数字进行排序 --------------------------------------------- 这题没什么好说的,用 str.split(' ') 获 ...

  9. ArcGIS图框工具5.2发布,支持ArcGIS10.0,10.110.2,支持国家2000坐标系

    ArcGIS图框工具5.2发布,支持ArcGIS10.0,10.110.2,支持国家2000坐标系 下载地址http://files.cnblogs.com/gisoracle/atktoolnew. ...

随机推荐

  1. 讲题专用——线段树——优化DP

    题目链接:http://codevs.cn/problem/3342/ 题解: 最小化最大值:二分 二分最长空题段 令f[i]表示抄第i道题所花费的最小时间 状态转移方程:f[i]=min(f[j]) ...

  2. CSS3实现PS中的蚁行线动画以及画布的马赛克背景图

    话不多说,先看例子,外链 效果截图如下: 蚁行线 马赛克背景 代码: 蚁行线代码如下: /* <!-- HTML代码 --> <div class="ant"&g ...

  3. springmvc,controller层在接收浏览器url传来的参数带中文乱码问题。

    请求地址:http://localhost:8080/saveFlashSale?fsRemark=哈哈哈哈哈 接收方法:@RequestMapping("/saveFlashSale&qu ...

  4. concurrent(五)同步辅助器CountDownLatch & 源码分析

    参考文档: https://blog.csdn.net/zxdfc/article/details/52752803 简介 CountDownLatch是一个同步辅助类.允许一个或多个线程等待其他线程 ...

  5. 《Linux就该这么学》培训笔记_ch04_Vim编辑器与Shell命令脚本

    <Linux就该这么学>培训笔记_ch04_Vim编辑器与Shell命令脚本 文章最后会post上书本的笔记照片. 文章主要内容: Vim编辑器 Shell脚本 流程控制语句 if语句 f ...

  6. 微信小程序之使用函数防抖与函数节流

    函数防抖和函数节流都是老生常谈的问题了.这两种方式都能优化 js 的性能.有些人可能会搞混两个的概念.所以,我以自己的理解,来解释这两个概念的含义.并且列举在小程序中这两个方法的使用. 函数防抖: 英 ...

  7. 基于已有集群动态发现方式部署 Etcd 集群

    etcd提供了多种部署集群的方式,在「通过静态发现方式部署etcd集群」 一文中我们介绍了如何通过静态发现方式部署集群. 不过很多时候,你只知道你要搭建一个多大(包含多少节点)的集群,但是并不能事先知 ...

  8. docker 安装 sqlserver 数据库

    具备条件: 1.服务器需要大于2G内存.如果不够则可能无法正常启动,查看日志报如下错误:This program requires a machine with at least 2000 megab ...

  9. HTTP协议随笔

    代理 代理就是处在客户端和服务端之间的服务器.客户端例如浏览器发送GET请求时,代理服务器接收该请求,并转发该请求至服务所在的服务器.服务器回复的数据和资源在第一时间经过代理服务器,才能回传到浏览器, ...

  10. mysql 中的日期格式。date_format( ) 转换格式

    date_format( ) 转换格式 : 格式 描述 %a 缩写星期名 %b 缩写月名 %c 月,数值 %D 带有英文前缀的月中的天 %d 月的天,数值(00-31) %e 月的天,数值(0-31) ...