爬虫(2)- HTTP和HTTPS 相关知识

HTTP和HTTPS

HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。html

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。java

SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络链接进行加密,保障在Internet上数据传输的安全。web

  • HTTP的端口号为80
  • HTTPS的端口号为443

HTTP工做原理

网络爬虫抓取过程能够理解为模拟浏览器操做的过程浏览器

浏览器的主要功能是向服务器发出请求,在浏览器窗口中展现您选择的网络资源,HTTP是一套计算机经过网络进行通讯的规则。缓存

HTTP的请求与响应

HTTP通讯由两部分组成: 客户端请求消息 与 服务器响应消息安全

 

浏览器发送HTTP请求的过程:

  1. 当用户在浏览器的地址栏中输入一个URL并按回车键以后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。服务器

  2. 当咱们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。cookie

  3. 浏览器分析Response中的 HTML,发现其中引用了不少其余文件,好比Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。网络

  4. 当全部的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。session

URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其余资源的地址的一种标识方法。

 

基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

  • scheme:协议(例如:http, https, ftp)
  • host:服务器的IP地址或者域名
  • port#:服务器的端口(若是是走协议默认端口,缺省端口80)
  • path:访问资源的路径
  • query-string:参数,发送给http服务器的数据
  • anchor:锚(跳转到网页的指定锚点位置)

例如:

客户端HTTP请求

URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括如下格式:

请求行请求头部空行请求数据

四个部分组成,下图给出了请求报文的通常格式。

 

一个典型的HTTP请求示例

 

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.baidu.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A; BDUSS=nF0MVFiMTVLcUh-Q2MxQ0M3STZGQUZ4N2hBa1FFRkIzUDI3QlBCZjg5cFdOd1pZQVFBQUFBJCQAAAAAAAAAAAEAAADpLvgG0KGyvLrcyfrG-AAA

 

  

 

 

 

请求方法

GET https://www.baidu.com/ HTTP/1.1

根据HTTP标准,HTTP请求可使用多种请求方法。

HTTP 0.9:只有基本的文本 GET 功能。

HTTP 1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP 1.1:在 1.0 基础上进行更新,新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

HTTP 2.0(未普及):请求/响应首部的定义基本没有改变,只是全部首部键必须所有小写,并且请求行要独立为 :method、:scheme、:host、:path这些键值对。

 

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 相似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会致使新的资源的创建和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务器。
7 OPTIONS 容许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。

 

HTTP请求主要分为GetPost两种方法

  • GET是从服务器上获取数据,POST是向服务器传送数据

  • GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese

  • POST请求参数在请求体当中,消息长度没有限制并且以隐式的方式进行发送,一般用来向HTTP服务器提交量比较大的数据(好比请求中包含许多参数或者文件上传操做等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码,

注意:避免使用Get方式提交表单,由于有可能会致使安全问题。 好比说在登录表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。

经常使用的请求报头

1. Host (主机和端口号)

Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,一般属于URL的一部分。

2. Connection (连接类型)

Connection:表示客户端与服务链接类型

  1. Client 发起一个包含 Connection:keep-alive 的请求,HTTP/1.1使用 keep-alive 为默认值。

  2. Server收到请求后:

    • 若是 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭链接;
    • 若是 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭链接。
  3. 若是client收到包含 Connection:keep-alive 的响应,向同一个链接发送下一个请求,直到一方主动关闭链接。

keep-alive在不少状况下可以重用链接,减小资源消耗,缩短响应时间,好比当浏览器须要多个文件时(好比一个HTML文件和相关的图形文件),不须要每次都去请求创建链接。

3. Upgrade-Insecure-Requests (升级为HTTPS请求)

Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器再也不显示https页面中的http请求警报。

HTTPS 是以安全为目标的 HTTP 通道,因此在 HTTPS 承载的页面上不容许出现 HTTP 请求,一旦出现就是提示或报错。

4. User-Agent (浏览器名称)

User-Agent:是客户浏览器的名称,之后会详细讲。

5. Accept (传输文件类型)

Accept:指浏览器或其余客户端能够接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器能够根据它判断并返回适当的文件格式。

举例:

Accept: */*:表示什么均可以接收。

Accept:image/gif:代表客户端但愿接受GIF图像格式的资源;

Accept:text/html:代表客户端但愿接受html文本。

Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、全部的图像格式资源。

q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于得到其“;”以前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被赋值为0,则用于表示浏览器不接受此内容类型。

Text:用于标准化地表示的文本信息,文本消息能够是多种字符集和或者多种格式的;Application:用于传输应用程序数据或者二进制数据。详细请点击

6. Referer (页面跳转处)

Referer:代表产生请求的网页来自于哪一个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性能够用来跟踪Web请求来自哪一个页面,是从什么网站来的等。

有时候遇到下载某网站图片,须要对应的referer,不然没法下载图片,那是由于人家作了防盗链,原理就是根据referer去判断是不是本网站的地址,若是不是,则拒绝,若是是,就能够下载;

7. Accept-Encoding(文件编解码格式)

Accept-Encoding:指出浏览器能够接受的编码方式。编码方式不一样于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应以后先解码,而后再检查文件格式,许多情形下这能够减小大量的下载时间。

举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

若是有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回通过gzip编码的HTML页面。 若是请求消息中没有设置这个域服务器假定客户端对各类内容编码均可以接受。

8. Accept-Language(语言种类)

Accept-Langeuage:指出浏览器能够接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器可以提供一种以上的语言版本时要用到。

9. Accept-Charset(字符编码)

Accept-Charset:指出浏览器能够接受的字符编码。

举例:Accept-Charset:iso-8859-1,gb2312,utf-8
  • ISO8859-1:一般叫作Latin-1。Latin-1包括了书写全部西方欧洲语言不可缺乏的附加字符,英文浏览器的默认值是ISO-8859-1.
  • gb2312:标准简体中文字符集;
  • utf-8:UNICODE 的一种变长字符编码,能够解决多种语言文本显示问题,从而实现应用国际化和本地化。

若是在请求消息中没有设置这个域,缺省是任何字符集均可以接受。

Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它能够记载和服务器相关的用户信息,也能够用来实现会话功能,之后会详细讲。

11. Content-Type (POST数据类型)

Content-Type:POST请求里用来表示的内容类型。

举例:Content-Type = Text/XML; charset=gb2312:

指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。

服务端HTTP响应

HTTP响应也由四个部分组成,分别是: 状态行消息报头空行响应正文

 

HTTP/1.1 200 OK
Server: Tengine
Connection: keep-alive
Date: Wed, 30 Nov 2016 07:58:21 GMT
Cache-Control: no-cache
Content-Type: text/html;charset=UTF-8
Keep-Alive: timeout=20
Vary: Accept-Encoding
Pragma: no-cache
X-NWS-LOG-UUID: bd27210a-24e5-4740-8f6c-25dbafa9c395
Content-Length: 180945

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ....

  

经常使用的响应报头(了解)

理论上全部的响应头信息都应该是回应请求头的。可是服务端为了效率,安全,还有其余方面的考虑,会添加相对应的响应头信息,从上图能够看到:

1. Cache-Control:must-revalidate, no-cache, private。

这个值告诉客户端,服务端不但愿客户端缓存资源,在下次请求资源时,必需要重新请求服务器,不能从缓存副本中获取资源。

  • Cache-Control是响应头中很重要的信息,当客户端请求头中包含Cache-Control:max-age=0请求,明确表示不会缓存服务器资源时,Cache-Control做为做为回应信息,一般会返回no-cache,意思就是说,"那就不缓存呗"。

  • 当客户端在请求头中没有包含Cache-Control时,服务端每每会定,不一样的资源不一样的缓存策略,好比说oschina在缓存图片资源的策略就是Cache-Control:max-age=86400,这个意思是,从当前时间开始,在86400秒的时间内,客户端能够直接从缓存副本中读取资源,而不须要向服务器请求。

2. Connection:keep-alive

这个字段做为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp链接也是一个长链接,客户端能够继续使用这个tcp链接发送http请求。

3. Content-Encoding:gzip

告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

4. Content-Type:text/html;charset=UTF-8

告诉客户端,资源文件的类型,还有字符编码,客户端经过utf-8对资源进行解码,而后对资源进行html解析。一般咱们会看到有些网站是乱码的,每每就是服务器端没有返回正确的编码。

5. Date:Sun, 21 Sep 2016 06:18:21 GMT

这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不一样时区在相互请求资源的时候,时间混乱问题。

6. Expires:Sun, 1 Jan 2000 01:00:00 GMT

这个响应头也是跟缓存有关的,告诉客户端在这个时间前,能够直接访问缓存副本,很显然这个值会存在问题,由于客户端和服务器的时间不必定会都是相同的,若是时间不一样就会致使问题。因此这个响应头是没有Cache-Control:max-age=*这个响应头准确的,由于max-age=date中的date是个相对时间,不只更好理解,也更准确。

7. Pragma:no-cache

这个含义与Cache-Control等同。

8.Server:Tengine/1.4.6

这个是服务器和相对应的版本,只是告诉客户端服务器的信息。

9. Transfer-Encoding:chunked

这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。通常分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,因此采用分块发送,每一块都是独立的,独立的块都能标示本身的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就能够肯定资源已经传输完了。

10. Vary: Accept-Encoding

告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,如今这个字段用处并不大,由于如今的浏览器都是支持压缩的。

响应状态码

响应状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

常见状态码:

  • 100~199:表示服务器成功接收部分请求,要求客户端继续提交其他请求才能完成整个处理过程。

  • 200~299:表示服务器成功接收请求并已完成整个处理过程。经常使用200(OK 请求成功)。

  • 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、经常使用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
  • 400~499:客户端的请求有错误,经常使用404(服务器没法找到被请求的页面)、403(服务器拒绝访问,权限不够)。
  • 500~599:服务器端出现错误,经常使用500(请求未完成。服务器遇到不可预知的状况)。

服务器和客户端的交互仅限于请求/响应过程,结束以后便断开,在下一次请求时,服务器会认为新的客户端。

为了维护他们之间的连接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。

Cookie:经过在 客户端 记录的信息肯定用户的身份。

Session:经过在 服务器端 记录的信息肯定用户的身份。

 

HTTP代理神器Fiddler

Fiddler是一款强大Web调试工具,它能记录全部客户端和服务器的HTTP请求。 Fiddler启动的时候,默认IE的代理设为了127.0.0.1:8888,而其余浏览器是须要手动设置。

 

Fiddler界面

 

请求 (Request) 部分详解

  1. Headers —— 显示客户端发送到服务器的 HTTP 请求的 header,显示为一个分级视图,包含了 Web 客户端信息、Cookie、传输状态等。
  2. Textview —— 显示 POST 请求的 body 部分为文本。
  3. WebForms —— 显示请求的 GET 参数 和 POST body 内容。
  4. HexView —— 用十六进制数据显示请求。
  5. Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(受权) 信息.
  6. Raw —— 将整个请求显示为纯文本。
  7. JSON - 显示JSON格式文件。
  8. XML —— 若是请求的 body 是 XML 格式,就是用分级的 XML 树来显示它。

响应 (Response) 部分详解

  1. Transformer —— 显示响应的编码信息。
  2. Headers —— 用分级视图显示响应的 header。
  3. TextView —— 使用文本显示相应的 body。
  4. ImageVies —— 若是请求是图片资源,显示响应的图片。
  5. HexView —— 用十六进制数据显示响应。
  6. WebView —— 响应在 Web 浏览器中的预览效果。
  7. Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(受权) 信息。
  8. Caching —— 显示此请求的缓存信息。
  9. Privacy —— 显示此请求的私密 (P3P) 信息。
  10. Raw —— 将整个响应显示为纯文本。
  11. JSON - 显示JSON格式文件。
  12. XML —— 若是响应的 body 是 XML 格式,就是用分级的 XML 树来显示它 。
相关文章
相关标签/搜索