requests库可以说是Python中使用最广泛的HTTP库了。但是大多数用户也许不知道requests当前稳定版本接受长度小于Content-Length头所给出的长度的响应。如果不仔细检查的话,可能在不经意间就使用了损坏的数据。现在告诉你这一点不知道算不算是彩蛋?为了让大家避免同样的问题,所以写下这篇文章告诉大家。今天就让我们看看为什么当前requests版本没有做这个检查,和如何在你的脚本中进行手动检查。
![a48e2e3b89fc5e127ce85980419d997f.png](https://i-blog.csdnimg.cn/blog_migrate/e36bb8e4f817c39b7e7c204ab2d56e7b.jpeg)
在正式开始本文的介绍之前,先给大家一个彩蛋:你了解python知识,就基本玩过爬虫吧,玩爬虫你也一定会用requests库,这个库的作者是大名鼎鼎的Kenneth Reitz 。很厉害的网站,发现他又出新招,变成一个把爬虫下载器和解析器联合在一起的库。这个库直接内置了html网页的解析,相当于是自带酒水,非常方便,号称是给人类用的网页解析库。我们只需要用pip 直接install 即可。pip install requests-html ,这个库它内置了requests库,pyquery库,bs库,还有一些编码的库。最厉害的是,它能把随机代理库fake-useragent也集成进来了,我们来看我们今天的重点知识:
什么是Content-Length头?
在HTTP协议中,Content-Length头说明了请求或响应体的长度。它以8位字节给出,其中1个8位字节是8位。为了简单起见,通篇文章我将使用术语字节而不是8位字节。通常,Content-Length头用于通知接收方当前请求(或响应)何时完成。没有它的话,你不知道你是否接收到了所有的数据或者你不知道是否有更多的数据需要读取。当然,服务器可以在每个请求或响应结束后断开连接(HTTP1.0就是这样的),但是到了HTTP1.1,除非另有声明所有的连接都被视为持续性的。这显著地加快了通信速度,因为你无需为每个请求单独打开一个连接。
在阅读完上述段落之后,下面的问题可能会出现在你的脑海中:
如果我收到Content-Length的值比收到的字节数少会发生什么?
在某些情况下(网络或服务器端错误