爬虫漫游指南

HTTP/2 网站爬取

最近写爬虫的时候遇到了一个用HTTP 2.0协议的网站,requests那套老经验在它身上不好用了,得专门针对HTTP 2.0进行开发。

因为与HTTP 1.x的爬虫颇有区别,所以写篇文章记录一下。考虑到大多数读者应该更关心实践操作,所以本文会采取倒金字塔结构,首先介绍HTTP 2.0的爬虫代码该怎么写,然后在慢慢讲解HTTP 2.0的基础理论知识。

① HTTP 2.0爬虫代码

上面说过,requests的老经验在HTTP 2.0上不好用了,因为requests只能作为HTTP 1.X的客户端使用,尚未支持2.0,而且大家也都知道,requests库的作者Kenneth中文名坑尼斯,名为K神,实则坑神,指望他升级requests支持HTTP 2.0还不如指望骑马与砍杀早日出3(手动狗头),所以要另寻高明了。

四处看了一圈,目前python中比较好的选择就是hyper了,虽然年久失修,github上关注度也不高,作者似乎也弃坑了,但起码它能动起来……如果有更好的选择跪求推荐。

下面就来看一下hyper的代码怎么写。

from hyper import HTTP20ConnectionHEADERS = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/80.0.3987.149 Safari/537.36"
}if __name__ == "__main__":with HTTP20Connection(host="jobs.zhaopin.com",secure=True,# proxy_host="123.123.123.123:12345",   # 在本地windows无法挂代理) as conn:req = conn.request("GET","/CC473390084J00530078001.htm",     # '/path/segment'headers=HEADERS)rsp = conn.get_response(req)rsp_content = rsp.read()rsp_text = rsp_content.decode()print(rsp_text)

建立连接:

代码其实很好理解,先用HTTP20Connection()建立一个HTTP 2.0连接,类似requests中建立一个session,需要注意的是,由于协议本身的问题,hyper不支持requests直接发一个requests.get()这样的写法。用with进行上下文管理是为了省略手动close()的步骤。

挂代理:

可以看到proxy_host这行被我注释掉了,因为windows中hyper挂不了代理,这是个大坑,且听我细细道来。

首先,pip install hyper安装的不是最新版hyper,pip能安装到的最新的一个版本,是不支持HTTPS+2.0+代理这个组合的,hyper的源码是这么写的:

if self.secure:assert not self.proxy_host, "Proxy with HTTPS not supported."

然而现实中使用2.0的网站几乎100%使用了HTTPS。那么看到这里你可能要喷了,不能挂代理的垃圾库,怎么用来写爬虫?

别慌,我们可以去github上获取他的最新版本,最新版本已经支持HTTPS挂代理了,但是没有在pip上发布,这也是为什么我认为作者弃坑了……从github上获取源码手动安装可能会稍微麻烦一丢丢,但为了能挂代理,也值了。

但是,这个挂代理的大坑到这里还没有结束。最新版挂代理的功能在windows下用不了呵呵呵呵呵,不知道是不是SSL环境问题之类的,不过在linux底下倒是很OK,所以可以本地开发的时候不挂代理,在Linux上运行时再挂上。

好了,挂代理的问题说完了,接着往下讲。

请求页面信息:

和名为"jobs.zhaopin.com"的主机建立连接后,就尝试用get方法取获取一个页面的信息。放心,虽然2.0了,get/post这些老朋友还是在的。

但这里还有一个地方是和requests有显著区别的,requests中,通常是res=requests.get(),发起get请求后得到的是一个response对象,但这里不同,从变量的命名就能看出来,这里我写的是req=conn.request(),显然是request的缩写,因此还需要再去获取一下这个请求对应的响应conn.get_response(req)。这个区别是由于2.0的多路复用特性导致的,下文基础理论部分会细说。

最后,HTTP 2.0传输的是二进制字节流,所以拿到响应要看的话得decode()一下哦。

② HTTP 2.0爬虫代码之:我与requests共存亡

——“我就是要用requests!不让我用我就不写爬虫了!我辞职!”
——“那要不你写一个支持2.0的requests?”
——“我不会!我不管!我就是要用requests!”

对于这种令人脑阔疼的小老弟,hyper作者早有准备,但是请先接受一波嘲讽:
Do you like requests? Of course you do, everyone does! It’s a shame that requests doesn’t support HTTP/2 though.

嘲讽完了就该上代码了

import requests
from hyper.contrib import HTTP20Adapters = requests.Session()
s.mount('https://http2bin.org', HTTP20Adapter())
r = s.get('https://http2bin.org/get')
print(r.status_code)

既然是非要用requests的选手,那想必对它的底层应该是了如指掌了,这一小段代码的原理也就无需我赘述了。

③ 理论基础

学院派请移步RFC7540,我这里主要挑HTTP 2.0的特点、优点,以及和爬虫相关的理论知识讲一讲,RFC文档可是整整96页呢。

另外,牢记一点,2.0的一切改变,都是为了让大家浏览网页更快、更安全。

数据包

HTTP 1.X的数据包就是起始行+头部+正文,按顺序逐行来,这是任何一个爬虫工程师都应该滚瓜烂熟的东西了。2.0则把这个包给拆开了,并且不再是报文的形式。

1.x的头部和正文分别被拆成了HEADERS帧和DATA帧,采用二进制编码,不再明文传输。也就是说,抓包的时候,看到的是头归头,正文归正文,各自独立的。

说到抓包再插个嘴,fiddler之类的抓包工具是抓不了2.0的,你会看到一些奇怪的、和实际网络传输情况并不一致的抓包结果。

头部压缩

2.0优化的一个重头戏,就是对头部的压缩,叫做HPACK算法。

大家一致认为,HTTP的头部太啰嗦了,差不多的内容反反复复的传过来传回去,极其浪费!而且有些可恶的开发者,cookie洋洋洒洒写个几K东西进去,害的HTTP数据包每一躺行程都要负重前行。

既然很多头部信息是来回重复传输的,那么客户端和服务端各自维护一个索引表,双方心知肚明就行了,何必重复传输呢?

HPACK算法,一句话解释一下,大致就是用哈夫曼编码噼里啪啦一顿操作把HEADER变小了。具体解释一下,RFC7541写了55页,自己看吧。

多路复用的单一长连接

所谓多路复用,即在一个TCP连接中存在多个流,即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能。

单一长连接,可以理解成requests里建立一个session,然后在这个session里来回传数据。建立TCP连接的成本还是比较高的,所以一个TCP连接反复使用非常划算。

上面提到的维护头部索引表,客户端和服务端能够做到双方心知肚明,就是因为这个单一长连接的存在,HTTP 1.x这种环境是无法实现维护一个索引表的。

Server Push

服务端主动推送,可以说是HTTP 2.0中我最喜欢的一个特性。

比如你打开一个网页,在1.x中,你请求html,服务器返回html给你,然后你请求css,服务器返回css文件给你,然后js,然后img,大家排好队一个个来,你不请求,服务器是不会给你的。

但是在2.0中就不同了,既然你访问了我的网页,而且你没缓存我网页的css和js文件,那服务器把这些资源发给你不是理所当然的事吗,为什么要等你请求了再给你呢,主动给你推送过来不香吗。

当然,主动推送也不能霸王硬上弓,你设置好拒绝主动推送的话服务端也不会强行塞给你的。

结语

HTTP 2.0目前还没有大范围的推广开来,但我隐隐感觉未来2.0的爬虫和反爬对抗会比现在更为艰难,叹气.jpg……

爬虫漫游指南:HTTP/2 网站爬取相关推荐

  1. 网站爬取工具_Python项目:结合Django和爬虫开发小说网站,免安装,无广告

    前言 很多喜欢看小说的小伙伴都是是两袖清风的学生党,沉迷小说,不能自拔.奈何囊中甚是羞涩,没有money去看正版小说,但是往往这些免费的小说网站或者小说软件,随之而来的是大量的广告. Python嘛, ...

  2. Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程

    Scrapy是一个用于爬行网站以及在数据挖掘.信息处理和历史档案等大量应用范围内抽取结构化数据的应用程序框架,广泛用于工业. 在本文中我们将建立一个从Hacker News爬取数据的爬虫,并将数据按我 ...

  3. 爬虫漫游指南:瑞数的反调试陷阱

    爬虫漫游指南 瑞数的反调试陷阱 遇上有反爬的网站,第一反应肯定是要先打开开发者工具调试一波,于是,反爬工程师们就在此处设下了第一道防线.初级一点的,例如监听F12,禁用鼠标右键,作为防线的一部分,这些 ...

  4. 爬虫漫游指南:加速乐__jsl_clearance破解

    爬虫漫游指南 JS破解之加速乐 本文会介绍加速乐cookie中的__jsl_clearance的生成方式.纯粹技术讨论,如果侵害到任何人的利益,请联系本人邮箱yu_haojia@foxmail.com ...

  5. mysql 去重con_python 爬虫 实现增量去重和定时爬取实例

    前言: 在爬虫过程中,我们可能需要重复的爬取同一个网站,为了避免重复的数据存入我们的数据库中 通过实现增量去重 去解决这一问题 本文还针对了那些需要实时更新的网站 增加了一个定时爬取的功能: 本文作者 ...

  6. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

  7. 网站爬取工具_浅析阻碍网站内容被蜘蛛抓取的原因有哪些?

    众所周知,在搜索引擎中存在的蜘蛛其实就是一段代码,这段代码通过在各个网站爬取,以便于网站内容能够被搜索引擎收录.不过一般蜘蛛爬取是按照一定规则进行的,如果网站中出现了一些爬取障碍,那么蜘蛛爬取就会被打 ...

  8. python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

    Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...

  9. 爬虫学习笔记(用python爬取东方财富网实验)

    参考文章以及视频:(11条消息) 爬虫实战 | 爬取东方财富网股票数据_简说Python的博客-CSDN博客.手把手教你从东方财富网上获取股票数据_哔哩哔哩_bilibili.[Python爬虫案例] ...

最新文章

  1. python程序设计与应用教程鄂大伟_鄂大伟-从零进阶的Python教学与开发之路.pdf
  2. IDEA工具实现反编译操作
  3. 数组按逆向求最大差值的算法
  4. STM32:GPIO的8种输入输出模式深入详解
  5. CNN中input,output的计算推导
  6. openEuler软件包加固项目笔记
  7. python在统计专业的应用_Python统计学statistics实战
  8. Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹
  9. linux考勤机密码,一种基于Linux操作系统的考勤机的制作方法
  10. rclone 实现 GoogleDrive 同步至 OneDrive
  11. 如何清除浏览器历史记录-在Chrome,Firefox和Safari中删除浏览历史记录
  12. HTML2——图像、超链接
  13. tailwindcss使用教程
  14. unity 监听文件夹更新,获取本地图片并显示
  15. 天天都在和游戏打交道,你知道到底什么是游戏UI吗?优漫动游
  16. 关于虚拟机VMware中打开Ubuntu20.04提示AMD-V处于禁用状态解决办法(基于MSI微星主板)
  17. linux fw_printenv fw_setenv 设置uboot环境变量
  18. shell中的脚本测试
  19. Brain Stimulation: ​大脑电生理记录和刺激工具包(BEST)
  20. 大数据Hadoop之——Hadoop HDFS多目录磁盘扩展与数据平衡实战操作

热门文章

  1. FFMpeg ver 20160219-git-98a0053 滤镜中英文对照 2016.02.21 by 1CM
  2. SQL server 删除某一列
  3. 【AI测试】人工智能测试整体介绍
  4. 面试答案-简单回答k8s容器启动的过程
  5. linux及时释放内存,LINUX释放内存
  6. Tensorflow深度学习学习笔记
  7. InnoDB存储引擎简介
  8. uni-app使用map组件开发map地图,获取后台返回经纬度进行标点
  9. 项目分享-限流框架的实现
  10. LOAM算法(论文+代码)详解(一)—— 引言+特征提取