Python爬虫 —— 网络请求原理及HTTP格式分析
HTTP网络请求原理
HTTP是一套计算机通过网络进行通信的规则,它由两部分组成:客户端请求消息和服务器响应消息。
HTTP工作原理
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下过程:
(1)客户端与服务器建立连接
(2)客户端向服务器提出请求
(3)服务器接收请求,并根据请求给客户端做出响应
(4)客户端与服务器关闭连接
客户端与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。
常用的请求方法
- GET请求:
请求参数都显示在URL上,服务器根据该请求所包含URL中的参数来产生响应内容。由于请求参数都暴露在外,所以安全性不高。
- POST请求:
请求参数都请求体中,消息长度没有限制而且采用隐式发送,通常用来向HTTP服务器提交量比较大的数据和安全性高的内容。POST请求的参数不在URL中,而在请求体中,所以安全性高,使用的场合比GET多。
客户端HTTP请求格式
客户端发送一个HTTP请求到服务器的请求消息,由请求行、请求头、空行、以及请求数据这四个部分组成。
1 Request URL: https://www.baidu.com/ 2 Request Method: GET 3 Status Code: 200 OK 4 Remote Address: *.*.*.*:* 5 Referrer Policy: no-referrer-when-downgrade 6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 7 Accept-Encoding: gzip, deflate, sdch, br 8 Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 9 Referer: http://www.baidu.com/ 10 Cache-Control: max-age=0 11 Connection: keep-alive 12 Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A; H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554; BD_UPN=12314753; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM=0 13 Host: www.baidu.com 14 Sec-Fetch-Dest: document 15 Sec-Fetch-Mode: navigate 16 Sec-Fetch-Site: none 17 Sec-Fetch-User: ?1 18 Upgrade-Insecure-Requests: 1 19 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2454.99 Safari/537.36
- Accept(传输文件类型):指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions 多用途互连网邮件扩展)文件类型,服务器可以根据它判断并返回适当的文件格式。
- Accept-Encoding(文件编解码格式):指出浏览器可以接受的编码方式。编码方式不同于文件格式,它的作用是压缩文件并加速文件传递速度。
- Accept-Language(语言种类):指出浏览器可以接受的语言种类,如en或en-us指英文,zh或zh-cn指中文,当服务器能够提供一种以上的语言版本时用到。
- Accept-Charset(字符编码):指出浏览器可以接受的字符编码。
- Referer(页面跳转来源):表明产生请求的页面来自于哪个URL,用户是从该Referer页面访问到当前请求的页面。
- Cache-Control(通用消息头字段):被用于http请求和响应中,通过指定指令来实现缓存机制。
- Connection(连接类型):表示客户端与服务器的连接类型。
- Cookie:浏览器用这个属性向浏览器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现模拟登陆。
- Host(主机和端口号):指定被请求资源的Internet主机和端口号,对应网络URL中的Web名称和端口号,通常属于URL的Host部分。
- Sec-Fetch-Dest(请求的目的地):获取元数据标头请求的目的地,即如何使用获取的数据。
- Sec-Fetch-Mode:获取元数据标头表明了一个请求的模式。
- Sec-Fetch-Site:获取元数据标头表明了一个请求发起者的来源与目标资源来源之间的关系。
- Sec-Fetch-User:获取元数据标头表明了一个导航请求是否用户激活触发。
- Upgrade-Insecure-Requests(升级为HTTPS请求):表示升级不安全的请求,会在加载HTTP资源时自动替换成HTTPS请求,让浏览器不再显示HTTPS页面中的HTTP请求警报。
- User-Agent(浏览器名称):标识客户端身份的名称,通常页面会根据不同的User-Agent信息自动做出适配,甚至返回不同的响应内容。
服务器端HTTP响应格式
HTTP响应由四部分组成,分别是:状态行、响应报头、空行、以及响应正文。
1 Bdpagetype: 1 2 Bdqid: 0xffaa5ae5000299ae 3 Cache-Control: must-revalidate, no-chahce private 4 Connection: keep-alive 5 Content-Encoding: gzip 6 Content-Type: text/html;charset=utf-8 7 Date: Fri, 21 May 2021 14:02:17 GMT 8 Expires: Fri, 21 May 2021 14:01:55 GMT 9 Server: BWS/1.1 10 Set-Cookie: BDSVRTM=0; path=/ 11 Set-Cookie: BD_HOME=1; path=/ 12 Set-Cookie: H_PS_PSSID=33802_31253_33848_33675_33607_34036_26350_34025; path=/; domain=.baidu.com 13 Strict-Transport-Security: max-age=172800 14 Traceid: 1621605737061338241018422637165306616238 15 Transfer-Encoding: chunked 16 X-Ua-Compatible: IE=Edge,chrome=1
- Cache-Control:must-revalidate,no-cache,private ---- 这个报头值告诉客户端,服务器端不希望客户端缓存资源,在下次请求资源时,必须要重新请求服务器,不能从缓存副本中获取资源。
- Connection:keep-alive ---- 该报头回应客户端的Connection:keep-alive,告诉客户端服务器的TCP连接也是一个长连接,客户端也可以继续使用这个TCP连接发送HTTP请求。
- Content-Encoding:gzip ---- 该报头的取值告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
- Content-Type:text/html;charset=UTF-8 ---- 这个报头值告诉客户端,资源文件的类型,还有字符编码。客户端需要使用UTF-8格式对资源进行解码,然后对资源进行HTML解析。通常我们看到有些网站出现乱码,往往就是服务器端没有返回正确的编码。
- Date:Fri, 21 May 2021 14:02:17 GMT ---- 该报头表示服务器端发送资源时的服务器时间,GMT是格林尼治标准时间。HTTP协议中发送的时间都是GMT的,这主要解决在互联网上,不同时区在相互请求资源时的时间混乱问题。
- Expires:Fri ,21 May 2021 14:01:55 GMT ---- 这个响应头也跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本。
- Progma:no-cache ---- 这个报头的含义与Cache-Control等同。
- Server:BWS/1.1 ---- 这个报头表示服务器对用的版本,仅用于告诉客户端服务器的信息。
- Transfer-Encoding:chunked ---- 该响应报头告诉客户端,服务器发送资源的方式是分块发送的。
- Vary:Accept-Encoding ---- 该报头告诉缓存服务器,缓存压缩文件和非压缩文件两个版本。如今这个报文的用处并不大,因为现在的浏览器都是支持压缩的。
响应码 | 描述 |
100~199 | 表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程 |
200~299 | 表示服务器成功接收请求并已完成整个处理过程。 |
300~399 | 为完成请求,客户需进一步细化请求 |
400~499 | 客户端的请求有错误 |
500~599 | 服务器出现错误 |
HTTP文档