爬虫基础知识之HTTP基本原理
文章目录HTTP基本原理URI和URL超文本HTTP和HTTPSHTTP请求过程请求HTTP基本原理首先,我们要了解HTTP的基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么。了解这些内容有助于我们进一步了解爬虫的基本知识。URI和URL我们先了解一下URI和URL,URI的全称为Uniform Resource Identifier,即统一资源标志符,URL的全称Universal
HTTP基本原理
首先,我们要了解HTTP的基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么。了解这些内容有助于我们进一步了解爬虫的基本知识。
URI和URL
我们先了解一下URI和URL,URI的全称为Uniform Resource Identifier,即统一资源标志符,URL的全称Universal Resource Locator,即统一资源定位符。
举个例子,https://github.com/favicon.ico是Github的网站图标链接,它是一个URL,也是一个URI。即有这样的一个图标资源,我们用URL/URI来唯一制定了它的访问方式。这其中包括了访问协议https、访问路径(/即根目录名)和资源名称favicon.ico。通过这样一个链接,我们便可以从互联网上找到这个资源,这就是URL/URI。
URL是URI的子集,也就是说每个URL都是URI,但不是每个URI都是URL。 URI还包括一个子类叫做URN,它的全称为Universal Resource Name,即统一资源名称。这只是命名资源,URL、URN和URI的关系可以用下图表示。
但是在目前的互联网,URN用得非常少,所以几乎所有得URI都是URL,一般的网页链接我们既可以称为URL,也可以称为URI。
超文本
我们再了解一个概念——超文本,其英文名称叫做hypertext,我们在浏览器里看到的网页就是超文本解析而成的,其网页源代码就是一系列HTML代码,里面包含了一些列标签,比如img显示图片,p制定显示段落等。浏览器解析这些标签后,便形成了我们平常看到网页,而网页的源代码HTML就可以称为超文本。
例如,我们在Chrome浏览器里随便打开一个首页。右键检查或者按F12,就可以看到网页源代码,这些源代码都是超文本。
HTTP和HTTPS
我们看到,URL的开头会有http和https,这就是访问资源所需要的协议类型。有时还会看到ftp、sftp、smb开头的URL,它们都是协议类型。在爬虫中,我们抓取的页面通常就是http或https协议的,这里首先了解一下两个协议的含义。
HTTP的全称是Hyper Text Transfer Protocol,中文名叫作超文本传输层协议。HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档。 HTTP由万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)共同合作指定地规范,目前广泛使用地是HTTP1.1版本。
HTTPS的安全基础SSL,因此通过它传输的内容都是经过SSL加密的,它的主要作用可以分为两种。
- 建立一个信息安全通道来保证数据传输的安全。
- 确认网站的真实性,凡是使用了HTTPS的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过CA机构颁发的安全签章来查询。
关于HTTP和HTTPS更多可以查看这篇文章:HTTP状态码、HTTP和HTTPS
HTTP请求过程
我们在浏览器输入一个URL,回车后便会在浏览器中观察到页面内容。实际上,这个过程是浏览器向网站所在的服务器发送了一个请求,网站服务器接收到这个请求后进行处理和解析,然后回应对应的响应,接着传回浏览器。响应里面包含了页面的源代码等内容。浏览器再对其解析,便将网页展现了出来。
此处的客户端即为我们的PC或手机浏览器,服务器即要访问的网站所在的服务器。
我们同样可以通过实例来观察:
来观察这样一个网络请求,www.baidu.com
各列含义如下:
- 第一列Name:请求的名称,一般会将URL的最后一部分内容当作名称。
- 第二列Status:响应的状态码,这里显示200.代表响应是正常的。通过状态码,我们可以判断发送了请求之后是否得到了正常的响应。
- 第三列Type:请求的文档类型。这里为document,代表我们请求的是一个HTML文档,内容就是一些HTML代码。
- 第四类Initiator:请求源。用来标记请求是由哪个对象或进程发起的。
- 第五列Size:从服务器下载的文件和请求的资源大小。如果从缓存中取得的资源,则该列会显示from cache
- 第六列Time:发起请求到获取响应所用的总时间
- 第七列Waterfall:网络请求的可视化瀑布流。
可以点击某一个条目,查看详细信息:
首先是General部分,Request URL为请求的URL,Request Method为请求的方法,Status Code为响应状态码,Remote Address为远程服务器的地址和端口,Referrer Policy为Referrer判别策略。
下面,可以看到有Response Headers和Request Headers,这分别代表响应头和请求头。请求头里带有许多信息,例如浏览器标识、cookies、Host等信息,这是请求的一部分,服务器会根据请求头内的信息判断请求是否法,进而作为对应的响应。图中看到的Response Headers就是响应的一部分,例如其中包含了服务器的类型文档类型、日期等信息,浏览器接收到响应后,会解析相应内容,进而呈现网页内容。
下面来看看请求和响应都包含哪些内容:
请求
请求,由客户端向服务端发出,可以分为4部分内容;请求方法(Request Method)、请求的网址(Reques URL)、请求头(Reques Headers)、请求体(Request Body)
1.请求方法
常见的请求方法有两种:GET和POST。
在浏览器直接输入URL并回车,这便发起了一个GET请求,请求的参数会直接包含到URL里。例如,在百度中搜索python,这就是一个GET请求,链接为https://www.baidu.com/s?wd=Python,其中URL中包含了请求的参数信息,这里参数wd表示要搜寻的关键字。POST请求大多在表单提交时发器。比如,对于一个登录表单,输入用户名和密码之后,点击“登录”按钮。这通常会发起一个POST请求,其数据通常以表单的形式传输,而不会体现在URL中。
GET和POST请求方法有如下区别。
- GET请求中的参数包含在URL里面,数据可以在URL中看到,而POST请求的URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
- GET请求提交的数据最多只有1024字节,而POST方式没有限制。
关于GET和POST的区别,可以查看这篇文章:GET和POST的区别
2.请求的网址
请求的网址,即统一资源定位符URL,它可以唯一确定我们想请求的资源。
3.请求头
请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cooike,Referer,User-Agent等。
下面简要说明一些常用的头信息 - Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language:指定客户端可接受的语言类型。
- Accept-Encoding:指定客户端可接受的内容编码。
- Host:用于指定请求资源的主机ip和端口号,其内容为请求URL的原始服务器或网关的位置。从HTTP1.1版本开始,请求必须包含此内容。
- Cooike:也常用复数形式Cooikes,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登陆状态信息,后面我们每次刷新或请求站点的其他页面时,发现都是登陆状态,这就是Cooikes的功劳。Cooikes里有信息标识了我们对应服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上Cooikes并将其发送给服务器,服务器通过Cooikes识别出是我们自己,并且查出当前状态是登陆状态,所以返回结果就是登陆之后才能看到的网页内容。
- Referer:此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并作相应的处理,如做来源统计、防盗链处理等。
- User-Agent:简称UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别为爬虫。
- Conten-Type:也叫做互联网媒体类型(Internet Media Type)或者MIME类型,在HTML协议消息头中,它用来表示具体请求中的媒体类型信息。例如,text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型,更多对应关系可以查看此对照表:http://tool.oschina.net/commons
因此,请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头。
4.请求体
请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为控。
例如,这里在登录Github时捕获到的请求和响应
登陆之前,由于填写了用户名和密码信息,提交时这些内容就会以表单数据的形式提交给服务器,此时需要注意Request Headers中指定Content-Type为application/x-www-form-urlencoded。只有设置为这样,才会以表单数据的形式提交。另外,我们也可以将Content-Type设置为application/json来提交JSON数据,或者设置为multipart/form-data来上传文件。
下表列出了Content-Type和POST提交数据方式的关系。
内容类型 | 提交数据的方式 |
---|---|
应用程序/x-www-form-urlencoded | 表单数据 |
多部分/表单数据 | 表单文件上传 |
应用程序/json | 序列化JSON数据 |
文本/xml | XML数据 |
在爬虫中,如果要构造POST请求,需要使用正确的Content-Type,并了解各种请求库的各个参数设置时使用的是哪种Contenet-Type,不然可能会导致POST提交后无法正常响应。
响应
响应,由服务端返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。
1.响应状态码
响应状态码表示服务器的响应状态,如200代表服务器正常响应,404代表页面未找到,500代表服务器内部发生错误。在爬虫中,我们可以根据状态码来判断服务器响应状态,如状态码为200,则证明成功返回数据,再进行进一步的处理,否则直接忽略。下面列出了常见的错误代码以及错误原因。
2.响应头
响应头包含了服务器对请求的应答信息,如Content-Type,Server,Set-Cooike等。下面简要说明一些常用的头信息。
- Data:标识响应产生的时间
- Last-Modified:指定资源的最后修改时间。
- Content-Encoding:指定响应内容的编码。
- Server:包含服务器的信息,比如名称、版本号等
- Content-Type:文档类型,指定返回的数据类型是什么。
- Set-Cooike:设置Cooikes。响应头中的Set-Cooikes告诉浏览器需要将此内容放在Cooikes中,下次携带Cooikes请求。
- Expires;指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。
3.响应体
最重要的当属响应体的内容。响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的HTML代码;请求一张图片时,它的响应体就是图片的二进制数据。我们做爬虫请求网页后,要解析的内容就是响应体,如图
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)