14天学习训练营导师课程:
杨鑫《Python 自学编程基础》
杨鑫《 Python 网络爬虫基础》
杨鑫《 Scrapy 爬虫框架实战和项目管理》
1.HTTP 请求报文
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是万维网服务器将超文本传输 到本地浏览器的传送协议,基于 TCP/IP 通信协议来传递数据。HTTP 是无状态的,以此限 制每次连接只处理一个请求。服务器在处理完客户端请求,并接收到客户端的应答后,即断开连接,这种方式的好处是节省传输时间。
当然,如果想保持连接,可以在请求首部字段中添加请求头 Connection: keep-alive
,表 明使用持久连接,或者通过 Cookie 这类方式间接地保存用户之前的 HTTP 通信状态。
HTTP 请求报文由四部分组成,依次是请求行
、请求头
、空行
和请求正文
。下面依次 对这四部分进行介绍。
1.1 请求行
请求行它由请求方法、URL 和 HTTP 版本三个字段组成,使用空格进行分隔。
比如访问百度, 请求行
的内容为 如下。 HTTP/1.1 定义了八种请求方法,具体描述如表 1.1 所示
八种请求方法
方法 | 描述 |
---|---|
GET | 请求指定页面,并返回页面内容 |
POST | 一般用于提交表单或上传数据,数据被包含在请求体中 |
PUT | 客户端向服务器发送数据,以取代指定文档内容 |
DELETE | 请求服务器删除指定页面 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
HEAD | 类似于 GET 请求,只是返回的响应无具体内容,一般用于获取报头 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,一般用于测试或诊断 |
常见的请求头
请求头 | 解释 | 示例 |
---|---|---|
Accept |
指定客户端能够接收的内容类型 | Accept:text/plain, text/html |
Accept-Charset |
浏览器可以接收的字符编码集 | Accept-Charset:iso-8859-5 |
Accept-Encoding |
指定浏览器可以支持的 Web 服务器返回内容 的压缩编码类型 | Accept-Encoding:compress, gzip |
Accept-Language |
浏览器可接收的语言 | Accept-Language:en,zh |
Accept-Ranges |
可以请求网页实体的一个或多个子范围字段 | Accept-Ranges:bytes |
Authorization |
HTTP 授权的授权证书 | Authorization:BasicQWxhZGRpbjpvcGVuIHNlc2FTZQ== |
Cache-Control |
指定请求和响应遵循的缓存机制 | Cache-Control:no-cache |
Connection |
表示是否需要持久连接(HTTP 1.1 默认进行 持久连接) | Connection:close |
Cookie |
HTTP 请求发送时,会把保存在该请求域名下 的所有 Cookie 值一起发送给 Web 服务器 | Cookie:$Version=1; Skin=new; |
Content-Length |
请求的内容长度 | Content-Length:348 |
Content-Type |
请求的与实体对应的 MIME 信息 | Content-Type:application/x-www-form-urlencoded |
Date |
请求发送的日期和时间 | Date:Tue, 15 Nov 2010 08:12:31 GMT |
Expect |
请求的特定的服务器行为 | Expect:100-continue |
From |
发出请求的用户的 E-mail | From:user@email.com |
Host |
指定请求的服务器的域名和端口号 | Host:www.zcmhi.com |
If-Match |
只有请求内容与实体相匹配才有效 | If-Match: "737060cd8c284d8af7ad3082f209582d“ |
If-Modified-Since |
如果请求的部分在指定时间之后被修改,则请 求成功;否则,返回 304 代码 | If-Modified-Since:Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match |
如果内容未改变,返回 304 代码,参数为服务 器先前发送的 Etag,通过与服务器回应的 Etag 比较判断是否改变 | If-None-Match:“737060cd8c284d8af7ad3082 f209582d” |
If-Range |
如果实体未改变,服务器发送客户端丢失的部 分;否则,发送整个实体,参数也为 Etag | If-Range:"737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since |
只有实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since:Sat, 29 Oct 2010 19:43:31GMT |
Max-Forwards |
限制信息通过代理和网关传送的时间 | Max-Forwards:10 |
Pragma |
用来包含实现特定的指令 | Pragma:no-cache |
Proxy-Authorization |
连接到代理的授权证书 | Proxy-Authorization:Basic QWxhZGRpbjpvcGV uIHNlc2FtZQ== |
Range |
只请求实体的一部分,指定范围 | Range:bytes=500-999 |
Referer |
先前网页的地址,当前请求网页紧随其后,即来路 | Referer:http://blog.csdn.net/coder_pig |
TE |
客户端愿意接收的传输编码,并通知服务器接收尾 加头信息 | TE:trailers,deflate;q=0.5 |
Upgrade |
向服务器指定某种传输协议以便服务器进行转换 (如果支持) | Upgrade:HTTP/2.0,SHTTP/1.3,IRC/6.9, RTA/x11 |
User-Agent |
User-Agent 的内容包含发出请求的用户信息 | User-Agent:Mozilla/5.0 (Linux;X11) |
Via |
通知中间网关或代理服务器地址,通信协议,标识 一个请求经过的网关路由节点 | Via:1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning |
关于消息实体的警告信息 | Warn:199 Miscellaneous warning |
在实际开发过程中,请求头不限于上面这些内容,可以通过抓包的方式查看所用到的 请求头,然后在编写爬虫时添加上。例如,Chrome 浏览器开发者工具下 www.baidu.com 的请求头如下:
1.3 空行
空行:请求头的最后会有一个空行,表示请求头结束,接下来是请求正文,这个空行必不 可少。
1.4 请求正文
这一般是 POST 请求中提交的表单数据。另外,在请求头 Content-Type 中要使用正确 的类型才能正常提交,如表单数据是 application/x-www-form-urlencoded、文件是 multipart/ form-data、JSON 数据是 application/json、XML 数据是 text/xml,在抓包时可以获取。
转载:https://blog.csdn.net/u014096024/article/details/128124216