1 Http Header

在爬虫抓取过程或者模拟登陆时, 很多时候实际上request headerresponse header不会成为爬虫的主要问题
以及疑点, 除了几个主要的字段:

  • Referer: 请求页面来源地址
  • User-Agent: 用户代理
  • Origin: 请求来自的站点
  • Content-Type: 编码格式
  • Accept: 可接受编码格式

一般而言, 只要在编写软件的时候较为严格的遵循抓取的包的请求头来模拟每一个请求, 一般在爬取数据时不会碰到问题,
这里主要介绍在爬取数据过程中, 因为请求头和响应头, 导致数据抓取有误的情况.
a) 无法解析响应体编码格式
以python2中的request包为例子, 实际上在爬取数据的时候开发者对请求头中的很多字段没有做到完全的理解, 这是实话, 哈哈,
或者开发是因为工作量, 对某些请求头和响应头没有认真的查看(~认真脸~), 实际上这样子在大部分情况是没有问题的.
直到有一天, 我们碰到了一个二进制格式的response.content, 然后就一脸懵逼, 甚至开始怀疑是不是请求有误, 实际上
这时候我们好好查看最后一个请求的Content-Type, 则会有惊喜.
比如, booking模拟登陆的最后一个响应如下格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 20 Feb 2019 09:24:04 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Cache-Control: private
Vary: User-Agent, Accept-Encoding
Content-Encoding: br
Set-Cookie: bkng=xxx; domain=.booking.com; path=/; expires=Mon, 19-Feb-2024 09:24:04 GMT; Secure; HTTPOnly
Strict-Transport-Security: max-age=604800
X-Content-Type-Options: nosniff
X-Recruiting: Like HTTP headers? Come write ours: https://careers.booking.com
X-XSS-Protection: 1; mode=block
Connection: keep-alive

这里还有一个booking的招聘贴链接呢, 呵呵, 这里可以看到返回的编码格式为br, 实际上这种编码格式(Brotli,是一种全新的数据格式
无损压缩,压缩比极高)在浏览器上以及charles中是可以正常解析的, 这时候你就会一脸懵逼, 到底发生了什么? 然后怀疑人生.
原因是什么? requests包默认不支持这种格式, 这时候就需要导入新的模块来解析response.content

1
2
import brotli
data = brotli.decompress(response.content).decode('utf8')