共计 5217 个字符,预计需要花费 14 分钟才能阅读完成。
这篇文章将为大家详细讲解有关如何解读爬虫中 HTTP 的基础知识,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
什么是 HTTP?
HTTP 的介绍
引自百度百科的权威回答:
超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最为广泛的一种网络协议。所有 WWW 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。
1960 年美国人 Ted Nelson 构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext), 这成为了 HTTP 超文本传输协议标准架构的发展根基。Ted Nelson 组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force)共同合作研究,最终发布了一系列的 RFC,其中著名的 RFC 2616 定义了 HTTP 1.1。
HTTP 协议是用于从 WWW 服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示 (如文本先于图形) 等。
HTTP 的模型
HTTP 采用了浏览器 / 服务器这种请求 / 响应模型,浏览器永远是 HTTP 请求的发起者,服务器为响应者。
这样在浏览器客户端没有发起请求的情况下,服务器是不能主动推送消息给客户端的。
HTTP 的定位
HTTP 是一个应用层协议,是我们想从服务器端获取信息的最直观的请求。比如,在爬虫中使用的 urllib 模块,requests 模块 等都是封装了 HTTP 协议,作为一个 HTTP 客户端实现了博文,图片,视频等信息源的下载。
但是 HTTP 也不是直接就可以用的,它的请求是建立在一些底层协议的基础上完成的。如 TCP/IP 协议栈中,HTTP 需要 TCP 的三次握手连接成功后才能向服务器发起请求。当然,如果是 HTTPS 的话,还需要 TSL 和 SSL 安全层。
一个完整的 HTTP 请求过程
既然 HTTP 协议需要建立在其它底层协议基础上,我们来看看一个完整的 HTTP 请求是什么样的。
当我们点击一个链接或者输入一个链接的时候,整个 HTTP 的请求过程就开始了,然后经过以下步骤得到 *** 的信息,我们这里简单介绍一下前四个步骤,旨在了解 HTTP。
1 域名解析
首先会搜索各种本地 DNS 缓存,如果没有就会向 DNS 服务器(互联网提供商)发起域名解析,以获取 IP 地址。
2 建立 TCP 连接
当获取 IP 后,将创建套接字 socket 连接,也就是 TCP 的 3 次握手连接,默认端口号 80。
3 HTTP 请求
一旦 TCP 连接成功后,浏览器 / 爬虫就可以向服务器发起 HTTP 请求报文了,报文内容包含请求行、请求头部、请求主体。
4 服务器响应
服务器响应,并返回一个 HTTP 响应包(如果成功会返回状态码 200)和请求的 HTML 代码。
上面的步骤 3 和 4 可以简单的示意如下,更方便大家理解。其中,请求和响应都包含特定格式的信息,具体我们接下来会继续解读。
响应 HTTP 请求会返回响应状态码,根据状态码可以知道返回信息的状态。状态码规定如下:
1xx: 信息响应类,表示接收到请求并且继续处理
100 mdash; mdash; 必须继续发出请求
101 mdash; mdash; 要求服务器根据请求转换 HTTP 协议版本
2xx: 处理成功响应类,表示动作被成功接收、理解和接受
200 mdash; mdash; 交易成功
201 mdash; mdash; 提示知道新文件的 URL
202 mdash; mdash; 接受和处理、但处理未完成
203 mdash; mdash; 返回信息不确定或不完整
204 mdash; mdash; 请求收到,但返回信息为空
205 mdash; mdash; 服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206 mdash; mdash; 服务器已经完成了部分用户的 GET 请求
3xx: 重定向响应类,为了完成指定的动作,必须接受进一步处理
300 mdash; mdash; 请求的资源可在多处得到
301 mdash; mdash; 删除请求数据
302 mdash; mdash; 在其他地址发现了请求数据
303 mdash; mdash; 建议客户访问其他 URL 或访问方式
304 mdash; mdash; 客户端已经执行了 GET,但文件未变化
305 mdash; mdash; 请求的资源必须从服务器指定的地址得到
306 mdash; mdash; 前一版本 HTTP 中使用的代码,现行版本中不再使用
307 mdash; mdash; 申明请求的资源临时性删除
4xx: 客户端错误,客户请求包含语法错误或者是不能正确执行
400 mdash; mdash; 错误请求,如语法错误
401 mdash; mdash; 未授权
402 mdash; mdash; 保留有效 ChargeTo 头响应
403 mdash; mdash; 禁止访问
404 mdash; mdash; 没有发现文件、查询或 URl
405 mdash; mdash; 在 Request-Line 字段定义的方法不允许
406 mdash; mdash; 根据发送的 Accept,请求资源不可访问
407 mdash; mdash; 用户必须首先在代理服务器上得到授权
408 mdash; mdash; 客户端没有在指定的时间内完成请求
409 mdash; mdash; 对当前资源状态,请求不能完成
410 mdash; mdash; 服务器不再有此资源且无进一步地址
411 mdash; mdash; 服务器拒绝用户定义的 Content-Length
412 mdash; mdash; 一个或多个请求头字段在当前请求中错误
413 mdash; mdash; 请求的资源大于服务器允许的大小
414 mdash; mdash; 请求的资源 URL 长于服务器允许的长度
415 mdash; mdash; 请求资源不支持请求项目格式
416 mdash; mdash; 请求中包含 Range 请求头字段,在当前请求资源范围内没有 range 指示值,请求也不包含 If-Range 请求头字段
417 mdash; mdash; 服务器不满足请求 Expect 头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。
5xx: 服务端错误,服务器不能正确执行一个正确的请求
500 mdash; mdash; 内部服务器错误
501 mdash; mdash; 未实现
502 mdash; mdash; 网关错误
HTTP 请求报文
相信你已经对 HTTP 的请求过程有了大致的了解了,下面我们来详细介绍 HTTP 请求的报文信息。
报文内容包含请求行、请求头部、请求主体。
下面我们来看一下通过开发者工具请求 https://www.baidu.com/ 网址截取下来的 HTTP 请求报文内容,对比一下上面的标准格式。
我们发现请求报文的格式与上面基本一致,正式我们想要的。那么,接下来我们将要逐个的介绍以上各个信息。
请求行
GET 是 HTTP 的请求方式之一,HTTP/1.1 协议中共定义了 8 种方法与服务器交互,有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,其中比较常用的是 GET 和 POST 方法了。
HEAD: 从服务器得到除了请求体与 GET 请求一样的响应
GET:通过 URL 获取查询资源信息(爬虫特定 URL 爬取)
POST:提交表单(爬虫中的模拟登录)
PUT:上传文件(浏览器不支持)
DELETE:删除
OPTIONS:返回服务器对特定资源支持的 HTTP 请求方法
TRACE:返回服务器收到的请求,用于测试或诊断
CONNECT:预留给管道连接方式的代理服务
GET 请求方法后 URL(这里是 /)和版本 1.1,别忘了空格。
请求头
HTTP 的头域包括通用头、请求头、响应头和实体头四部分。因为在爬虫过程中,我们经常会提交 headers 请求头信息用于伪装,所以我们这里对请求头着重讲解一下。
请求头是请求报文特有的,它向服务器提交了一些额外的信息,例如通过 Accept 字段信息,我们客户端可以告诉服务器我们接受一些什么类型的数据。而我们其实可以把这些字段信息就当成 键值对 对待。
下面我们看看这些字段都代表了什么意思?
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
含义:告诉浏览器我们接受 MIME 的类型
Accept-Encoding:gzip, deflate, br
含义:如果有这个字段,则代表客户端支持压缩将内容编码,去掉后会支持任意编码。
注意:爬虫时一般不要把它加上,博主最开始就是不懂全都复制过来,结果因为这个就是不好使卡住好长时间。
Accept-Lanague:zh-CN,zh;q=0.9
含义:告诉服务器能够接受的语言,没有则代表任何语言
Connection:keep-alive
含义:告诉服务器需要持久有效的连接状态(HTTP1.1 默认会进行持久连接)
Host:www.baidu.com
含义:客户端指定自己想访问的 web 服务器域名 /IP 地址和端口号
Cache-control:max-age=0
含义:(引自百度百科)
Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求 / 响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令通常覆盖默认缓存算法。缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令。
网页的缓存是由 HTTP 消息头中的“Cache-control”来控制的,常见的取值有 private、no-cache、max-age、must-revalidate 等,默认为 private。
但是 HTTP 请求和响应的 Cache-Control 是不完全一样的。
常见的请求 Cache-Control 取值有 no-cache , no-store , max-age , max-stale , min-fresh , only-if-cached。
响应的 Cache-Control 取值有 public , private , no-cache , no- store , no-transform , must-revalidate , proxy-revalidate , max-age。
我们这里主要介绍请求时的常见 Cache-Control 取值。
1 max-age =0
本例中使用 max-age=0,表示每次请求会访问服务器,通过 Last-Modified 来判断文件是否被修改,如果被修改,返回状态码 200 并得到 *** 文件,否则将返回 304 状态码并读取缓存文件。
2 max-age 0
表示会直接从浏览器提取缓存。
3 no-cache
表示不会在浏览器缓存进行提取,而是强制的向服务器发出请求,这样可以保证客户端能够收到最权威的回应。
4 no-store
所有内容都不会被缓存到缓存或 Internet 临时文件中。
Upgrade-Insecure-Requests:1
含义:表示浏览器 / 爬虫可以处理 HTTPS 协议,并能自动升级请求从 HTTP 到 HTTPS。
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) ..Safari/537.36
含义:(这个是爬虫中最常用了)用于伪装成浏览器身份请求网页。它的意思自然就是表示浏览器的身份,说明是用的哪种浏览器进行的操作。
Cookies:
含义:(这个也是爬虫中很重要的了,通常用于模拟登录)
Cookies 是用于维持服务端的会话状态,由服务器端写入,然后在后续请求中,供服务器读取使用。
以上就是本例中出现的所有字段信息内容。当然,还有其它一些常用字段信息,这里也一起说明一下。
其它请求头字段信息
Referer:
含义:(这个也是爬虫常用到的,防盗链)
客户端通过当前 URL 代表的页面出发访问我们请求的页面。爬虫中,一般我们只要把它设置成请求的网页链接就好了。
Accept-Charset:
含义:(这个也是爬虫常用到的)
表示浏览器可接受的字符集,可以是 utf-8,gbk 等
If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT
含义:请求的内容在指定日期以后一旦被修改就被返回对象内容,否则返回“Not Modified”
Pragma:
含义:
Pragma 头域用来包含实现特定的指令,最常用的是 Pragma:no-cache。在 HTTP/1.1 协议中,它的含义和 Cache-Control:no-cache 相同。
Range:
含义:告诉浏览器自己想取对象的哪个部分。例如,Range: bytes=1173546
关于如何解读爬虫中 HTTP 的基础知识就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。