捉虫放大镜

博客园 首页 新随笔 联系 订阅 管理

学习爬虫需要对 HTTP 协议有一些了解,这样对于爬虫原理的理解会更加清晰,本实验开始部分将对 HTTP 协议做一些简单的介绍,由于课程核心为爬虫知识,HTTP 协议部分知识会以与爬虫关联度高的部分入手讲解,例如请求头、响应头、状态码以及内容类型。

HTTP 消息结构

HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是目前互联网使用最广泛的一种协议,例如你经常看到的网址 http://www.baidu.com,当访问百度网站的时候,其实就是使用 HTTP 协议,将数据从百度服务器传输到本地浏览器。

写爬虫就是通过 Python 程序去模拟这一过程,通过使用各种编程上的技巧,让网站服务器将数据通过 HTTP 协议返回给写好的解析程序,在将数据存储到本地。

对于 HTTP 消息结构,简单理解只有两部分构成:

  • 客户端请求消息
  • 服务器响应消息

客户端请求消息包括请求行、请求头、空行、请求数据四个部分,它们一般叫做请求报文。

服务器响应消息也是四个部分构成:状态行、消息报头、空行和响应正文。

以上内容在本系列实验中涉及的知识点包括:请求头、请求数据、响应正文,其它内容爬虫课程不做展开讲解。

学习到这里,相信大家已经对一个 HTTP 协议有了一个模糊的概念。接下来为了更好地掌握爬虫相关知识,还需要进行一个转换,将请求与响应切换成英文模式。请求对应的为 request,响应对应为 response,完成这一步之后,在打开谷歌浏览器的开发者工具,你可以快速定位到一个 HTTP 的请求消息与响应消息,具体参照下图右半部分:

图片描述

上图绿色框部分,包含了一些重要的请求头和响应头信息,我们依次进行解读。

首先是概括性部分:

图片描述

具体参数说明(只说明重要参数):

  • Request URL:请求地址;
  • Request Method:请求方法;
  • Status Code:状态码;
  • Remote Address:当前 HTTP 请求的远程地址;
  • Referrer Policy:用于设置 Referrer 策略,本系列实验不涉及。

概括性部分说明完毕,继续下翻找到 Request Headers 部分:

图片描述

该部分的参数将重点介绍,其中有很多参数都会对爬虫程序产生比较大的影响,甚至可以说所有的爬虫都是在不断的伪造一个相对真实的请求头,然后让网站或者 APP 服务器发送正确的数据到我们本地。

具体参数说明(只说明重要参数):

  • Accept:客户端(浏览器)期望接收的内容类型(有文档会解释成浏览器支持的 MIME 类型,由于会引出更多的概念,故省略),大意为服务器要给我返回什么格式的数据,可以是 HTML 网页文件,也可以是 PNG 图片,更可以是各种音视频;
  • Accept-Encoding:客户端(浏览器)可以支持的内容压缩编码类型(一般不需要设置);
  • Accept-Language:客户端(浏览器)接受的语言格式;
  • Cookie:服务端给客户端传的 HTTP 请求状态,原因是因为 HTTP 协议是无状态的(有兴趣的同学可以检索下何为无状态协议),所以需要存储一些信息带客户端(浏览器)用于下次 HTTP 发起请求时,将数据传回服务器,该参数非常重要,后续实验会有所涉及;
  • Content-Length:请求内容的长度,一般用于请求音频或者视频等文件,需要借助文件大小实现;
  • HOST:请求的服务器的域名和端口号;
  • Referer:请求的上一个页面,该参数比较重要,爬虫程序经常需要借助该参数去访问一个网站的二级页面;
  • User-Agent:浏览器 UA,包含了一个特征字符串,用来让服务器对客户端(浏览器)发来的请求进行应用类型、操作系统、软件开发商以及版本号的相关判断,非常重要的参数,上一实验已经进行介绍。

以上为请求头相关参数说明,对于响应头将在后续实验中进行补充说明,本实验只介绍响应体内容。

在开发者工具中,除了 Headers 选项卡以外,还有一个 Response 选项卡,该部分即为响应体内容,具体位置如下图所示:

图片描述

切换到 Response 选项卡下,你将看到源码内容,如果想查看源码效果,切换到 Response 之前的 Preview 即可。

HTTP 请求方法

在上一实验中,通过 get 方法你获取到实验楼的课程数据,我们也曾提及跟 get 方法像类似的操作在 requests 库中存在几个, post、 put、 delete、 head、 options,学习了 HTTP 协议之后,你将明白这些其实对应的是 HTTP 协议中的请求方法。

HTTP 目前有两种标准,分别是 HTTP1.0,HTTP1.1。具体标准有何差异依旧为大家的扩展学习知识。

HTTP1.0 定义了三种请求方法,这三种也是爬虫中最常见的三种,分别是 GETPOSTHEAD

HTTP1.1 除了上述三种请求外,扩展了六种新的请求方法,分别是 OPTIONSPUTPATCHDELETETRACE 和 CONNECT

以上内容在有的教材上也被称作 HTTP 动词,requests 库提供了几乎所有 HTTP 动词的功能,鉴于本系列实验的定位,我们将把精力更多的放在 get 方法与 post 方法上。

HTTP 状态码

编写爬虫你需要了解常见的 HTTP 状态码,很多时候可以直接借助状态码完成爬虫的基本操作,状态码非常多,你只需要记住 3 个常见的即可,分别是:

  • 200 - 请求成功
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

在 Python 代码中展示一下如何获取状态码:

import requests

res = requests.get("http://app.mi.com/")
# 输出请求到的响应状态码
print(res.status_code)

上述代码最终输出的为 200,表示请求成功。在 requests 中内置了一个枚举可以直接用于判断是否请求成功:

import requests

res = requests.get("http://app.mi.com/")
# 输出请求到的响应状态码
if res.status_code == requests.codes.ok:
    print("请求成功")

对于 requests.codes.{具体的值} 在 requests 中提供了非常多的枚举,由于值非常多,我单独给大家准备了一个页面,可以查阅这个地址

posted on 2021-03-03 15:03  捉虫放大镜  阅读(87)  评论(0)    收藏  举报