【Python爬虫系列教程 2- 100】了解HTTP基本原理和爬虫的基本流程

HTTP基本原理

本节内容是了解HTTP的基本原理,以及在浏览器中输入URL,回车到获取网页内容之间的过程。


URL, URN与URI

URL全称为"Universal Resource Locator",即统一资源定位符。

URN全称为"Universal Resource Name",即统一资源名称。

URI全称为"Uniform Resource Identifier",即统一资源标志符。


例如,https://www.runoob.com/python3/python3-multithreading.html,它既是URL也是URI。
在这个网页中介绍了python3多线程相关知识,我们通过这个URL/URI来访问它,这其中包括了访问协议HTTPS,访问路径和资源名称python3-multithreading.html。

URL是URI的子集,URN只命名了一个资源,例如书籍的ISBN,参考文献的标注等等。可以说URL,URN一起组成了URI。

但是鉴于URN的使用极少,因此所有的URI都是URL,网页的链接称URL或者URI都可以,不作区分。

超文本

超文本(Hypertext)是一种可以显示在电脑显示器或其他电子设备的文本,其中的文字包含有可以链接到其他字段或者文档的超链接,允许从当前阅读位置直接切换到超链接所指向的文字。超文本文档通过超链接相互链接,超链接通常通过鼠标点击,按键设置或触屏来点阅。来源于维基百科

浏览器中看到的网页都是由超文本解析而来,它们是一系列的HTML代码,这些HTML代码就称为超文本。

在Chrome浏览器中按下快捷键F12,可以在Elements部分看到网页的HTML源代码。

HTTP和HTTPS

https://www.bilibili.com中,URL的开头是https,它便是访问资源所需要的协议类型,有时候会有以http,sfp,sftp等等开头的URL,这些都是不同的访问协议,我们见的最多的便是http或者https协议了。


超文本传输协议(HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式,协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符URI来标识。

目前广泛使用的版本是HTTP 1。参考于维基百科


超文本传输安全协议(HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。
参考于维基百科

HTTPS传输的内容经SSL加密,所以它比HTTP更安全。


HTTP请求过程

当我们在浏览器中输入一个URL,回车后浏览器显示页面内容,这之间发生了什么?

这是一个很经典的问题,面试中经常出现,这里作一个简单的解释。

当我们往浏览器地址栏输入URL,浏览器会解析URL,找到对应的服务器,浏览器向网站所在的服务器发送了一个请求,网站的服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。响应里会包含了页面的源代码等内容,浏览器再对其进行解析,将网页呈现了出来。

打开Chrome浏览器,右键检查,选择“检查”,可以查看地址栏输入URL后回车,发生了怎样的网络请求。

在这里插入图片描述

例如输入bilibili的网址。

在这里插入图片描述

每个列的作用这里就不作详细介绍了,有兴趣的可以查阅相关资料。

下面我们来介绍一下请求和响应都包含哪些内容。

请求

请求是由客户端向服务端发出,由4部分内容:

请求方法(RequestMethod)

请求的网址(RequestURL)

请求头(RequestHeaders)

请求体(Request Body)。


请求方法

HTTP0 定义了三种请求方法:GET,POST和HEAD方法。

HTTP1 新增了六种请求方法:OPTIONS,PUT,PATCH,DELETE,TRACE和CONNECT方法。

常用的请求方法是GET和POST。

GET请求的参数会直接包含在URL中,提交的数据至多为1024字节;POST请求通常在表单提起时发起,数据以表单形式传输,不在URL中,数据量没有限制。
显然POST比GET更安全,也适用于文件传输。

HTTP的请求与其描述如下表所示:

方法 描述
GET 请求指定的页面信息,并返回实体主体
HEAD 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
PUT 从客户端向服务器传送的数据取代指定的文档的内容
DELETE 请求服务器删除指定的页面
CONNECT HTTP/1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS 允许客户端查看服务器的性能
TRACE 回显服务器收到的请求,主要用于测试或诊断
PATCH 是对PUT方法的补充,用来对已知资源进行局部更新
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改

更多信息可参考,https://www.runoob.com/http/http-methods.html


请求的网址

即URL,确定我们需要访问的资源。

请求头

请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie,Referer,User-Agent等。

部分请求头及其描述如下表:

方法 描述
Accept 指定客户端能够接收的内容类型
Accept-Charset 浏览器可接受的字符编码集
Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型
Accept-Language 浏览器可接受的语言
Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器
Content-Length 请求的内容长度
Content-Type 请求的与实体对应的MIME信息
Host 指定请求的服务器的域名和端口号
Referer 先前网页的地址,当前请求网页紧随其后,即来路
User-Agent User-Agent的内容包含发出请求的用户信息

更多信息可参考,维基百科

请求体

请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。

当我们填写自己的用户名和密码时,提交时这些信息就会以表单形式传送给服务器,需要指定Content-Type为application/x-www-form-urlencoded,这样才能以表单形式提交给服务器。
如果提交JSON类型的数据时,Content-Type就的为application/json。

在爬虫中,我们需要设定正确的Content-Type,才能得到预期的请求,否则在提交POST请求后会无法正常相应。

更多Content-Type和POST提交数据方式的关系,可参考https://tool.oschina.net/commons


响应

响应,由服务端返回给客户端,可以分为三部分:

响应状态码(Response Status Code)

响应头(Response Headers)

响应体(Response Body)。


响应状态码

响应状态码表示服务器的响应状态,如200代表服务器正常响应,301代表资源(网页等)被永久转移到其它URL,404代表页面未找到,500代表服务器内部发生错误。

更多HTTP状态码分类可参见,https://www.runoob.com/http/http-status-codes.html

响应头

响应头包含了服务器对请求的应答信息,如Content-Type,Server,Set-Cookie等。下面简要说明一些常用的头信息

方法 描述
Allow 服务器支持哪些请求方法(如GET,POST等)
Content-Encoding 指定响应内容的编码
Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain
Date 标识响应产生的时间,用setDateHeader来设置这个头以避免转换时间格式的麻烦
Expires 应该在什么时候认为文档已经过期,从而不再缓存它
Set-Cookie 设置Cookies。响应头中的Set-Cookie告诉浏览器需要将此内容放在Cookies中,下次请求携带Cookies请求
Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置

响应体

响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的 HTML 代码;请求一张图片时,它的响应体就是图片的二进制数据。我们做爬虫请求网页后,要解析的内容就是响应体,

在浏览器右键,就可以看到网页的源代码,也就是响应体的内容,它是解析的目标。

在做爬虫时,我们主要通过响应体得到网页的源代码,JSON数据等,然后从中做相应内容的提取。

整个Internet是一张大的网络,通过使用爬虫自动化工具,爬取我们想要访问的web下面的数据。爬虫爬取数据基本有四/五个步骤流程。

爬虫的基本流程

发起请求

通过HTTP库来向目标站点发起http请求,即是发送一个request,里面可以包含有header等信息,等待服务器响应。请求类型一般有GETPOST类型。

  • GET请求:在URL中携带参数
  • POST请求:需要构建表单,指定请求参数

在request的header里,可以指定user-agent, host, cookie, language, encoding等信息。

获取响应内容

如果服务器认为这是一个正常的请求,则会返回一个response给客户端,其内容就是该网页的内容,其类型可能是HTML, JSON字符串或者二进制数据(图片视频等)

解析响应内容

  • 如果返回内容为HTML内容,则使用一些库如beautifulsoup来解析获取需要的标签如div的值。
  • 如果返回内容为JSON内容,可以直接转换为JSON对象来进行解析。
  • 如果返回为二进制内容,可以做保存或者进一步处理。

保存数据

可以将解析后的数据保存到文本,Excel或者数据库,常见的方式为保存到如MongoDBRedis这类非关系型的数据库中。

分析数据

对保存后的数据进行进一步的分析。

观察HTTP/HTTPS访问过程

使用Chrome/Firefox浏览器打开网址,右键点击检查即可进入网页元素查看模式,选择Network页,会发现在 Network 页面的下方出现了一个个的条目,那么这一个条目就代表一次发送 Request 和接收 Response 的过程,如下图。

每条记录都分别有Name,Status,Type,Initiator,Size, TimeWaterfall,分别表示:

  • Name:即 Request 的名称。一般会用URL的最后一部分内容当做名称。
  • Status:即 Response 的状态码。这里显示为 200,代表 Response 是正常的,通过状态码我们可以判断发送了 Request 之后是否得到了正常的 Response。
  • Type:即 Request 请求的文档类型。这里为 document,代表我们这次请求的是一个 HTML 文档,内容就是一些 HTML 代码。
  • Initiator:即请求源。用来标记 Request 是由哪个对象或进程发起的。
  • Size:即从服务器下载的文件和请求的资源大小。如果是从缓存中取得的资源则该列会显示 from cache。
  • Time:即发起 Request 到获取到 Response 所用的总时间。
  • Waterfall:即网络请求的可视化瀑布流。

单机每个请求,在右侧可以看到header,preview,Response,CookiesTiming.其中Response是服务器返回数据,浏览器渲染这些数据显示成我们可见的样式。

注:在ALL旁边有XHR标签页,这个表示的是XMLHttpRequest 对象,Jquery中的Ajax就是对 XHR的封装。

猜你喜欢

转载自blog.csdn.net/weixin_54707168/article/details/114239026
今日推荐