前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解读爬虫中HTTP的秘密(基础篇)

解读爬虫中HTTP的秘密(基础篇)

作者头像
Python数据科学
发布2018-08-06 18:20:09
2870
发布2018-08-06 18:20:09
举报
文章被收录于专栏:Python数据科学Python数据科学

在学习爬虫的过程中,相信大家对HTTP这个词已经不陌生了,它好像从未离开过我们的视线。被迫所需,我们每次都要使用开发者工具去查看请求头,响应头,以及头中的各个字段,使用别人封装好的模块填入信息,敲几行代码就解决了。面对简单的爬取任务,我们也许根本不用管它是什么,但可能等我们真正遇到问题的时候,却无从下手。

认识并深刻理解HTTP对于爬虫的实现过程是非常有帮助的。为了更好的让大家理解爬虫中的HTTP,博主将分为两篇对HTTP进行讲述,<基础篇><高阶篇>。本篇为基础篇,将从以下几个部分进行阐述。

  • 什么是HTTP
  • 一个完整的HTTP请求过程
  • HTTP请求报文

什么是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——必须继续发出请求 101——要求服务器根据请求转换HTTP协议版本 2xx: 处理成功响应类,表示动作被成功接收、理解和接受 200——交易成功 201——提示知道新文件的URL 202——接受和处理、但处理未完成 203——返回信息不确定或不完整 204——请求收到,但返回信息为空 205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件 206——服务器已经完成了部分用户的GET请求 3xx: 重定向响应类,为了完成指定的动作,必须接受进一步处理 300——请求的资源可在多处得到 301——删除请求数据 302——在其他地址发现了请求数据 303——建议客户访问其他URL或访问方式 304——客户端已经执行了GET,但文件未变化 305——请求的资源必须从服务器指定的地址得到 306——前一版本HTTP中使用的代码,现行版本中不再使用 307——申明请求的资源临时性删除 4xx: 客户端错误,客户请求包含语法错误或者是不能正确执行 400——错误请求,如语法错误 401——未授权 402——保留有效ChargeTo头响应 403——禁止访问 404——没有发现文件、查询或URl 405——在Request-Line字段定义的方法不允许 406——根据发送的Accept,请求资源不可访问 407——用户必须首先在代理服务器上得到授权 408——客户端没有在指定的时间内完成请求 409——对当前资源状态,请求不能完成 410——服务器不再有此资源且无进一步地址 411——服务器拒绝用户定义的Content-Length 412——一个或多个请求头字段在当前请求中错误 413——请求的资源大于服务器允许的大小 414——请求的资源URL长于服务器允许的长度 415——请求资源不支持请求项目格式 416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段 417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。 5xx: 服务端错误,服务器不能正确执行一个正确的请求 500——内部服务器错误 501——未实现 502——网关错误

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的基本概念,主要包含了以下几点:

  • 什么是HTTP
  • HTTP的模型、作用和定位
  • 一个完整的HTTP请求过程
  • HTTP请求头信息
  • HTTP请求头常用字段信息

下篇将会分享一些HTTP的高级内容,包括如下内容:

  • Cookie
  • Sesssion
  • HTTPS

最后,欢迎大家给我留言,我们可以一起讨论,共同学习爬虫技术。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档