《python3网络爬虫开发实战 第二版》之爬虫基础-HTTP基本原理 详解

HTTP基本原理

URL

URL是统一资源定位符。我们在浏览器中访问一个网页时,输入的链接就是URL。URL的格式是有一定的规范要求的,基本的组成格式如下:
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]

其中,中括号里面的内容是非必要的。

  • scheme 协议,常用的有http,https,ftp等
  • username、password 用户名和密码。有时URL需要提供用户名和密码才可以访问,例如https://ssr3.scrape.center/这个URL需要用户名和密码才可以访问。我认为把用户名和密码放在URL中,这种做法现在不常见。
  • hostname 主机地址。域名或者时ip。
  • post 端口。时服务器端设定的端口
  • path 路径。网路资源在服务器中的指定地址。
  • parameters 参数 。现在用的不多。一般都是使用query,并且将query当成parameters。
  • query 查询。https://www.baidu.com/s?wd=query&rsv_spt=1这个链接中的wd=query&rsv_spt=1就是query,也就是get请求时,链接后面带的参数(现在一般称之为参数,而不是query。)
  • fragment 片段。可以认为是资源内部的标签。主要是用作单页面路由或者HTML锚点。

HTTP、HTTPS

前文说,scheme支持的协议有很多,爬虫时最常用的协议有两种:HTTP、HTTPS

HTTP

HTTP是超文本传输协议。作用是把超文本数据从网络传输到本地浏览器,可以保证高效而准确地传输超文本文档。目前广泛使用的是HTTP1.1,但是也有很多网站支持HTTP2.0。

HTTPS

HTTPS是HTTP的安全版。在HTTP下加入SSL层。HTTPS的安全基础是SSL。

SSL的作用主要有:

  • 建立一个信息安全通道,保证数据传输的安全性
  • 确认网站的真实性。

目前,网站使用HTTPS协议是大势所趋。

HTTP请求过程

我们在访问一个网页时,通常是在浏览器地址栏输入一个URL,按下回车键便可看到对应页面的内容。

实际上,这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的响应,接着传回浏览器,浏览器再对其进行解析,将页面展示出来。

打开google浏览器,访问百度。按键F12打开“开发者工具”,切换到network面板,重新加载页面。可以看到很多的条目信息。如下图所示。
开发者工具图
各列的含义如下:

  • name 请求的名称
  • status 响应状态码
  • protocol 请求的协议类型
  • type 请求的文档类型
  • Initiator 请求源
  • size 请求得到的文件或者资源的大小
  • time 从发起请求到接收到响应所花费的时间
  • waterfall 网络请求的可视化瀑布流

单击www.baidu.com这个条目,可以看到更详细的信息。如下图所示:
在这里插入图片描述
最上面是的General,详细内容如下:

  • Request URL 请求的URL
  • Request Method 请求的方法
  • Status Code 响应状态码
  • Remote Address 远程服务器的地址和端口
  • Referrer Policy Referrer判断策略

后面还有Response HeadersRequest Headers,分别是响应头和请求头

请求 request

请求(request)是指 客户端向服务器发送信息。分为四部分:

  • 请求方法 request method
  • 请求网址 request url
  • 请求头 request headers
  • 请求体 request body

请求方法 request method

请求方法是用于标识客户端向服务端请求信息的方式。常见的请求的方法有两种:GET和POST

  • 在浏览器中直接输入URL并回车,就发起了一个GET请求。GET请求的参数会直接包含在URL中,即前文提到的query。GET请求提交的数据最多可以1024字节。
  • POST请求大多是提交表单时发起。表单数据是通过表单形式传输,包含在请求体中,在URL中不会体现。并且对于提交的数据没有大小限制。例如登录时提交用户名和密码,如果采用GET方式,用户名和密码会直接暴露在URL中,可能会造成密码泄露,因此采用POST方式才是恰当的。还有传输文件时,文件比较大,也是采用POST比较合适。

常用的请求方式是GET和POST请求,但是还有一些其他的请求。下表参考菜鸟教程

方法描述
get请求页面,并返回页面内容
head与get类似,但是返回的响应中没有具体内容,用于获取报头
post用于提交表单或上传文件,数据包含在请求体中
put用客户端传向服务器的数据取代指定文档中的内容
delete请求服务器删除指定的页面
connect把服务器当做跳板,让服务器代替客户端访问其他页面
options允许客户端查看服务器的性能
trace回显服务器收到的请求。主要用于测试或诊断

请求网址 request url

请求的网址即URL,前文已述。

请求头request headers

请求头即说明服务器要使用的附加信息。比较重要的有:CookieRefererUser-Agent

常用的请求头信息如下:

  • Accept 请求报头域, 用于指定客户端可以接收哪些类型的信息
  • Accept-Encoding 指定客户端可以接收的内容编码
  • Accept-Language 指定客户端可以接收的语言类型
  • Host 指定请求资源的主机IP和端口号。
  • Cookie 网站为了辨别用户,进行会话跟踪而存储在用户本地的数据。主要的功能是维持当前访问会话。
  • Referer 标识请求从哪个页面发过来,服务器可以拿到这个信息并做响应的处理,如来源统计、防盗链处理等
  • User-Agent 可以使服务器识别客户端的操作系统及版本、浏览器及其版本等信息。在爬虫时,如果不加此信息,很可能被识别出来
  • Content-Type 用来表示具体请求中的媒体类型信息。text/html表示HTML格式,

请求头是请求的重要组成部分,在写爬虫时,通常需要设定请求头。

请求体 request body

请求体一般是POST请求的表单信息。GET请求时,请求体为空。

在提交表单时,根据提交数据方式的不同,请求头中Content-Type也不一样,具体如下表:

Content-TypePOST提交数据的方式
application/x-www-form-urlencode表单数据
multipart/form-data表单文件长传
application/json序列化JSON数据
textxml

在爬虫时,构造POST请求需要使用正确的Content-Type,否则可能会导致POST提交后无法得到正常响应。

响应 response

响应由服务器返回给客户端。包括三部分:响应状态码、响应头、响应体

响应状态码 response status code

响应状态码表示服务器的响应状态。在爬虫时可以根据状态码判断服务器的响应状态,如果状态码是200,就处理数据,否则就直接忽略。

常见的错误状态码及错误原因如下表所示:

状态码说明详情
100继续请求者应当继续提出请求。服务器已接收到请求的一部分,正在等待其余部分
101切换协议请求者已要求服务器切换协议,服务器已确认并准备切换
200成功服务器已成功处理了请求
201已创建请求成功并且服务器创建了新的资源
202已接收服务器已接收请求,但尚未处理
203非授权信息服务器已成功处理了请求,但是返回的信息可能来自另一个源
204无内容服务器成功处理了请求,但是没有返回任何内容
205重置内容服务器成功处理了请求,内容被重置
206部分内容服务器成功处理了部分内容
300多种选择针对请求,服务器可执行多种操作
301永久移动请求的网页已永久移动到新位置,永久重定向
302临时移动请求的网页暂时移动到新位置,暂时重定向
303查看其他位置如果原来的请求时POST,重定向目标文档应当通过GET提取
304未修改此次请求返回的网页未经修改,继续使用上次的资源
305使用代理请求者应当使用代理访问该页面
307临时重定向临时从其他位置响应请求的资源
400错误请求服务器无法解析该请求
401未授权请求没有进行身份验证或者验证未通过
403禁止访问服务器拒绝此请求
404未找到服务器找不到请求的网页
405方法禁用服务器禁用了请求中指定的方法
406不接收无法使用请求的内容响应请求的网页
407需要代理授权请求者需要使用代理授权
408请求超时服务器请求超时
409冲突服务器在完成请求时发生冲突
410已删除请求的资源已永久删除
411需要有效长度服务器不接收不含有效内容长度标头字段的请求
412未满足前提条件服务器未满足请求者在请求中设置的某一个前提条件
413请求实体过大请求实体过大,超出服务器的处理能力
414请求URI过长请求网址过长,服务器无法处理
415不支持类型请求格式不被请求页面支持
416请求范围不符页面无法提供请求的范围
417未满足期望值服务器未满足期望请求头字段的要求
500服务器内部错误服务器遇到错误,无法完成请求
501未实现服务器不具备完成请求的能力
502错误网关服务器作为网关或代理,接收到上游服务器的无效响应
503服务器不可用服务器目前无法使用
504网关超时服务器作为网关或代理,没有及时从上游服务器接收到请求
505HTTP版本不支持服务器不支持请求中使用的HTTP协议版本

响应头 response headers

响应头包含了服务器对请求的应答信息。常用的有:

  • Date 标识响应产生的时间
  • Last-Modified 指定资源的最后修改时间
  • Content-Encoding 指定响应内容的编码
  • Server 服务器的信息
  • Content-Type 指定返回的数据是什么类型
  • Set-Cookie 设置Cookie。告诉浏览器下次请求时,把Cookie带上
  • Expires 指定响应的过期时间,可以让代理服务器或浏览器将加载的内容更新到缓存中。

响应体 response body

响应体是爬虫最关键的部分,响应的正文数据都在响应体中。在做爬虫处理时,要解析的内容就是响应体

HTTP2.0

HTTP协议从2015年起就发布了2.0版本,相对于HTTP1.x,HTTP2.0更快、更简单、更稳定。HTTO2.0在传输层做了很多优化,它的主要目标是通过支持完整的请求与响应复用来减少延迟,并通过有效压缩HTTP请求头字段的方式将协议开销降至最低。同时增加对请求优先级和服务器推送的支持。(本人感觉稍稍有点抽象,看下面的就懂了)

HTTP2.0相对于HTTP1.x的优化有几个方面:二进制分帧层、多路复用、流控制、服务端推送

二进制分帧层

HTTP2.0所有性能增强的核心在于这个二进制分帧层。

在HTTP1.x中,请求和响应都是以文本格式传输,其headers和body之间也是用文本换行符进行分隔。
HTTP2.0将文本格式修改为了二进制格式,并将请求数据和响应数据分割为更小的帧,并采用二进制编码。

  • 帧: 只存在于HTTP2.0中,是数据通信的最小单元。例如一个请求被分为了请求头帧(request headers frame)、请求体帧(request data frame)
  • 数据流:一个虚拟通道,可以承载双向的消息,每个流都有唯一的整数ID进行标识。
  • 消息:与逻辑请求或响应消息对应得完整的一系列帧

HTTP2.0将HTTP协议通信分解为二进制编码帧的交换,这些帧对应着特定数据流中的消息,所有这些都在一个TCP连接中复用。

多路复用

HTTP1.x中,如果客户端想要发起多个并行请求以提高性能,必须要使用多个TCP连接,而且浏览器为了控制资源,还会对单个域名有6-8个TCP连接请求的限制。

HTTP2.0中,有了二进制分帧技术的加持,客户端和服务器可以将HTTP消息分解为互不依赖的帧,然后交错发送,最后在另一端把它们重新组装起来。

流控制

流控制是一种阻止发送方向接收方发送大量数据的机制,以免超出后者的需求或处理能力。由于HTTP2.0数据流在一个TCP连接内复用,TCP流控制不够精细,无法提供比较的应用级API来调节各个数据流的传输。

为了解决这一个问题,HTTP2.0提供了一组简单的构建块,这些构建块允许客户端和服务器实现它们自己的数据流和连接级流控制。

服务端推送

HTTP2.0另一个强大的功能是:服务器可以对一个客户端请求发送多个响应。也就是除了对最初请求的响应外,服务器可以主动向客户端推送额外资源(感觉就像是广告一样,不用客户端请求,服务器直接推送)

服务器可以主动推送,客户端也有权利选择是否接收,如果客户端不想要,可以通过发送RST_STREAM帧来拒收。

此外主动推送也要遵守同源策略。即服务器不能随便将第三方资源推送给客户端。


写在最后

本系列博客是根据崔庆才老师的《python3网络爬虫开发实战 第二版》整理而成。每篇博客对应于每一节。主要是为了记录书中的重点,便于自己温习。如有错误或不足,请提出,大家一起学习,一起进步。

另:若转载,请附上本文链接。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值