说明:本文参照Simon Munzert著&吴今朝译的《基于R语言的自动数据收集》一书,进行个人二次整合而成,如有侵权,告知后删。
同步转载至个人公众号:R语言学习
同步转载至个人知乎专栏:R数据处理
(一)HTTP基础知识
1、HTTP定义
HTTP(HyperText Transfer Protocol)意为超文本协议,本质上是网络客户端(如浏览器)和服务器(对请求进行响应的计算机)之间进行通信的协议,通信内容包括客户端从服务器获取几乎任何类型的资源(如文本、图片、音频、视频),还包括客户端向服务器发送各类型数据。
2、HTTP通信流程
(图为书中内容整理)
通信流程说明:
①用户首先通过鼠标/键盘点击或手动输入目标链接(即URL(Uniform Resource Locators),中文名称:统一资源定位符),向HTTP客户端(如常见的浏览器)传达数据查询需求。
②HTTP客户端收到需求后,将收到的URL信息向DNS服务器(域名系统)询问链接对应的具体IP地址,DNS服务器返回URL对应的IP地址。
③HTTP客户端再拿着IP地址通过TCP协议(传输控制协议,Transmission Control Protocol)和IP协议(Internet Protocol)向HTTP服务器发出数据请求,等待服务器响应。
④HTTP服务器将请求的相关信息返回给HTTP客户端,由客户端返回给客户。
⑤重复上述步骤①~④,直到所有请求执行完毕。
3、HTTP特点
HTTP是一个无状态协议。
这意味着,如果没有其他手段,客户端与服务器之间的每个请求-响应的来回,都会被默认当作首次交互来处理。
4、URL语法
4.1 URL格式
scheme://hostname:port/path?querystring#fragment
可见,一个完整的URL共有6部分构成,但是并不是每个部分都一定要具备。
例:https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1526179817032_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E6%B5%B7%E6%BB%A9
参数解释:
scheme:模式名,这里我们的模式为https
hostname:主机名,表示存放了我们需要的资源的主机名字,示例中的主机名为image.baidu.com,需要使用DNS域名系统将其转换为IP地址。
port:为TCP(传输控制协议)端口,不特别注明的情况下,默认端口为80。
path:为文件在主机中存放的路径,结构同普通文件路径一致。示例的路径为:search/index。
querystring:为查询字符串,通常格式为:name=value,一个URL钟可以有一个或多个查询字符串,多个查询字符串之间需要用&符号进行连接,示例中,我们共有23个查询字符串,均使用&符号连接。
fragment:为分段符,主要用于文档内容进行分段查询与显示,如http://www.w3.org:80/People/Berners-Lee/#Bio,表示直接查询文档中Bio部分,即人物传记部分。
4.2 URL编码规则
URL通过ASCII字符集传输,由于ASCII字符集仅有128个字符,所有不包含在该字符集中的字符(主要是特殊字符)都需要转义,即用标准表示法替代,如果直接输入未经转义的字符,则会报错。
例:在ASCII中,英文冒号的表示方式为“%3a”
更多字符转义方式请参见:http://www.w3school.com.cn/tags/html_ref_urlencode.html
5、HTTP消息-请求模式
请求模式
示例
(图为书中内容整理)
参数解释:
5.1 起始行
顾名思义,起始行是每个HTTP消息的第一行,在起始行中,我们定义了请求方法,即参数[method],定义了请求路径,即参数[path],还申明了客户端(主要是浏览器)能理解的HTTP最高版本,即参数[version]。
结合示例来看,①我们的请求模式为POST,该模式表示“利用正文消息向服务器发送数据/文件,从服务器检索资源”,关键点是向服务器主动发送数据再进行检索,而不是简单的查询。
②示例中请求路径为”/greetings.html ”。③申明了客户端能理解的HTTP最高版本为HTTP/1.1,即HTTP的1.1版。
5.1.1常用的请求方法
GET | 从服务器检索资源,且不会在消息正文中发送内容。(网络爬虫最为常用) |
POST | 利用消息正文向服务器发送数据/文件,如在表单中输入数据,从服务器检索资源。(网络爬虫最为常用) |
HEAD | 和GET工作原理类似,但服务器响应只有起始行和标头,没有正文,常用于监测检索请求是否成功被服务器接受。 |
PUT | 把请求消息的正文保存在服务器上。 |
DELETE | 从服务器删除一个资源。 |
TRACE | 追踪消息到达服务器沿途的路径,即请求获得发送某条请求消息后,直到到达服务器所经过的代理服务器清单。 |
OPTIONS | 返回支持的HTTP方法清单。 |
CONNECT | 建立一个网络连接。 |
5.2 标头
请求模式中的标头为客户端和服务器提供了元信息,定义了服务器接到请求后需要采取的行动,主要包括一些首选项和随消息一起发送的内容设置。
我们可以通过设置标头字段实现个性化的请求,标头字段格式:
[header name:] [header value]
即:标头名称:标头取值
示例请求中,Host: www.r-datacollection.com,其中Host为标头名称, www.r-datacollection.com为标头取值,即主机名。标头Host是HTTP/1.1版本需要用到的标头字段,在多个主机名重定向到同一个IP地址时,它能帮助服务器决定使用哪个URL。
5.2.1 常见的请求标头
标头字段名 | 使用说明 | 示例 | 示例说明 |
Accept | 告诉服务器哪种资源类型是客户端愿意当做响应来接收的。可接收的资源类型有多个时,需要用逗号分开,同时用分号后的内容定义其他参数,如返回的优先级别(q)。 | Accept: text/html,image/gif,image/*,*/*;q=0.8 | ①text/html,image/gif表示客户端接收HTML格式的文本和GIF格式的图片,对这两者没有设置优先级q,默认q=1,即最优先返回。 ②其次格式为image/*表示其他格式的图片可以接收,*/*表示其他任何格式的任何内容也可接收,*表示对对象无限制。*/*;q=0.8表示其他任何格式的任何内容接收的优先等级是0.8。 |
Accept-Encoding | 告诉服务器哪种编码/压缩方法客户端可以接受。可接收的编码/压缩方法有多个时,需要用逗号分开,同时用分号后的内容定义其他参数,如返回的优先级别(q)。 | Accept-Encoding: gzip,deflate,sdch;q=0.9,identity;q=0.8,*;q=0 | ①gzip,deflate表示客户端接收gzip和deflate编码方式,默认q=1,即最优先返回。 ②sdch;q=0.9,identity;q=0.8表示在没有gzip,deflate编码方式下,也可以接受sdch,优先级为q=0.9,居于第二位。如果sdch也没有,则接受identity,即无编码的内容。 ③*;q=0表示不接受任何其他的编码方式,q=0表示不接受。 |
Authorization | 向服务器传递用户名和密码的一种简单方式。用户名首先合并为username:password格式,然后根据Base64进行编码,保证用户名和密码中所涉及字符均在ASCII字符集中,编码结果不进行加密。 | Authorization: Basic cm9va211ojEyM0zTm90QVN1Y3VyZVBX | Basic申明了服务器端对用户名及密码验证方式为Basic,cm9va211ojEyM0zTm90QVN1Y3VyZVBX为经过编码后的用户名+密码。 |
Cookie | 从服务器发出的请求,用于识别客户端,判断是否与该客户端有过联系。字段内容由一对一对的name=value组成,每对参数用分号分隔。 | Cookie: sessionid=2783321;path=/;domain=r-datacollection.com;expires=Mon, 31-Dec-2035 23:00:00 GMT | 保留会话id号2783321直到Mon, 31-Dec-2035 23:00:00 ,时间标准采用GMT(世界标准时间)。 sessionid=2783321对域名r-datacollection.com及其所有子目录(通过path=/申明)有效。 |
From | 客户端在向服务器提交请求时,同时提供发送邮件地址的选项,在爬虫时,可以通过设置邮件地址,让网站管理员在必要时联系我们。 | Form: [email protected] | 附上在下的邮箱,欢迎大家多多交流。 |
Host | Host是HTTP/1.1版本需要用到的标头字段,在多个主机名重定向到同一个IP地址时,它能帮助服务器决定使用哪个URL。 | Host: www.r-datacollection.com:80 | www.r-datacollection.com为主机名,80为默认端口。 |
If-Modified-Since | 用于服务器判断客户端请求标头中提供的日期之后,客户端发出的请求中涉及到的资源是否被修改过。如果没有修改,则返回状态码:304 | If-Modified-Since: Thu,27 Feb Feb 2014 13:05:34 GMT | |
Connection | 用于设置客户端与服务器之间连接状态,在不同的HTTP版本中不太一致。 ①HTTP/1.0:在客户端获得服务器的响应后,默认会关闭连接,如需保持连接,需要手动设置Connection: Keep-Alive ②HTTP/1.1:在客户端获得服务器的响应后,默认是保持连接,如需关闭连接,需手动设置onnection: Close |
||
Proxy-Authorization | 用法同Authorization,只是Proxy-Authorization只适用于代理服务器。 | ||
Proxy-Connection | 用法同Connection,只是Proxy-Connection只适用于代理服务器。 | ||
Referer | 用于告诉服务器,对该资源的请求是从什么位置发出的。 | ||
User-Agent | 高诉服务器,提出资源请求的客户端信息,包括操作系统信息,浏览器信息,软件信息等。 | R version 3.0.2(2013-09-25),x86_64-w64-mingw32 | |
Via | 提供HTTP消息到达服务器所经过的代理服务器和网关ID。 |
6、HTTP消息-响应模式
待更。
(尊重劳动成果,转载请注明出处)