600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 熬夜爆肝整理的近2万字——python爬虫基础之HTTP协议

熬夜爆肝整理的近2万字——python爬虫基础之HTTP协议

时间:2019-02-04 04:24:41

相关推荐

熬夜爆肝整理的近2万字——python爬虫基础之HTTP协议

一、 HTTP 简介

HTTP协议是HyperTextTransfer Protocol (超文本传输协议)的缩写, 是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP 是一个基于TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0 的第六版,HTTP/1.1 的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP) 的建议已经提出。

HTTP 协议工作于客户端-服务端架构为上。浏览器作为HTTP 客户端通过URL 向HTTP 服务端即WEB 服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。

图1.1: http 请求-响应模型

二、 主要特点

1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP 服务器的程序规模小,因而通信速度很快。

2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

3、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

4、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

5、支持B/SC/S模式。

三、URL,URI,URN

这三个缩略词是Tim Berners-Lee 在一篇名为RFC 3986: Uniform Resource Identifier (URI):

Generic Syntax 的文档中定义的互联网标准追踪协议。

引文:统一资源标识符(URI) 提供了一个简单、可扩展的资源标识方式。URI 规范中的语义和语法来源于万维网全球信息主动引入的概念,万维网从1990 年起使用这种标识符数据,并被描述为“万维网中的统一资源描述符”。

Tim Berners-Lee , 万维网的发明者,同时也是万维网联盟(W3C) 的负责人。照片由Paul Clarke遵循CC BY-SA 4.0 协议提供。

3.1 URI* 统一资源标识符

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

URI(Uniform Resource Identifier) 即统一资源标志符。

3.2 URL* 统一资源定位符

URL, 全称是UniformResourceLocator, 中文叫统一资源定位符, 是互联网上用来标识某一处资

源的地址。

/favicon.ico 既是一个URL, 也是一个URI

即有这样的一个图标资源用URL/URI来唯一指定了它的访问方式这其中包括了访问协议HTTPS、访问路径(即根目录)和资源名称favicon, ico

URLURI的一个子集,也就是说每个URL都是URI, 但不是每个URI 都是URL

:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的URL 可以看出,一个完整的URL 包括以下几部分:

1. 协议部分:该URL 的协议部分为“http:”,这代表网页使用的是HTTP 协议。在Internet中可以使用多种协议,如HTTP,FTP 等等本例中使用的是HTTP 协议。在"HTTP" 后面的“//”为分隔符

2. 域名部分:该URL 的域名部分为“”。一个URL 中,也可以使用IP 地址作为域名使用

3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL 必须的部分,如果省略端口部分,将采用默认端口

4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL 必须的部分。本例中的虚拟目录是“/news/”

5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL 必须的部分,如果省略该部分,则使用默认的文件名

6. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL 必须的部分

7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

3.3 URN* 统一资源名称

URN(Universa I Resource Name) 即统一资源名称

URN只命名资源而不指定如何定位资源, 比如:

1. urn:isbn:0451450523 (其ISBN 编号,以确定一本书)

2. urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 (一个全局唯一标识符)

3. urn:publishing:book (标识文档作为一个图书类型的XML 命名空间)

4. urn: isbn:0451450523 指定了一本书的ISBN, 可以唯一标识这本书,但是没有指定到哪里定位这本书。

3.4 URI,URL,URN 的区别

URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。Web 上可用的每种资源如HTML 文档、图像、视频片段、程序等都是一个来URI 来定位的URI 一般由三部组成:

1、访问资源的命名机制

2、存放资源的主机名

3、资源自身的名称,由路径表示,着重强调于资源

URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL 可以用来标识一个资源,而且还指明了如何locate 这个资源。

URL是Internet 上用来描述信息资源的字符串,主要用在各种WWW 客户程序和服务器程序上,特别是著名的Mosaic。采用URL 可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL 一般由三部组成:

1、协议(或称为服务方式)

2、存有该资源的主机IP 地址(有时也包括端口号)

3、机资源的具体地址。如目录和文件名等

URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:javanet@

URI 是以一种抽象的,高层次概念定义统一资源标识,而URL 和URN 则是具体的资源标识的方式。URL 和URN 都是一种URI。笼统地说,每个URL 都是URI,但不一定每个URI 都是URL。这是因为URI 还包括一个子类,即统一资源名称(URN),它命名资源但不指定如何定位资源。上面的mailto、news 和isbn URI 都是URN 的示例。

在Java 的URI 中,一个URI 实例可以代表绝对的,也可以是相对的,只要它符合URI 的语法规则。而URL 类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。在Java类库中,URI 类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL 类可以打开一个到达资源的流。

图2: URL、URN 和URI 的关系图

四、HTTP 协议与HTTPS 协议

4.1 HyperText

超文本(英语:Hypertext)是一种可以显示在电脑显示器或电子设备上的文本,现时超文本普遍以电子文档的方式存在,其中的文字包含有可以链接到其他字段或者文档的超链接,允许从当前阅读位置直接切换到超链接所指向的文字。

浏览器里看到的网页就是超文本解析而成的,其网页源代码是一系列HTML代码,里面包含了一系列标签比如:

1、img显示图片

2、P指定显示段落等

浏览器解析这些标签后,便形成了我们平常看到的网页,而网页的源代码HTML 就可以称作超文本。

4.2 HTTP 与HTTPS

/ 中,URL 的开头会有http 或https 这个就是访问资源需要的协议类型,有时还会看到ftp. sftp. smb 开头的URL ftp 、sftpx smb 都是指的协议类型。

4.2.1超文本传输协议

(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是万维网的数据通信的基础。

设计HTTP 最初的目的是为了提供一种发布和接收HTML 页面的方法。通过HTTP 或者HTTPS 协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。

HTTP 的发展是由蒂姆·伯纳斯-李于1989 年在欧洲核子研究组织(CERN)所发起。HTTP 的标准制定由万维网协会(WorldWideWeb Consortium,W3C)和互联网工程任务组(InternetEngineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6 月公布的RFC 2616,定义了HTTP 协议中现今广泛使用的一个版本——HTTP 1.1。

年12 月,互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2 标准提议递交至IESG 进行讨论,于 年2 月17 日被批准。HTTP/2 标准于 年5 月以RFC 7540 正式发表,取代HTTP 1.1 成为HTTP 的实现标准。

4.2.2超文本传输安全协议

(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL 或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由HTTP 进行通信,但利用SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。这个协议由网景公司(Netscape)在1994 年首次提出,随后扩展到互联网上。

历史上,HTTPS 连接经常用于万维网上的交易支付和企业信息系统中敏感信息的传输。在2000 年代末至 年代初,HTTPS 开始广泛使用,以确保各类型的网页真实,保护账户和保持用户通信,身份和网络浏览的私密性。

另外,还有一种安全超文本传输协议(S-HTTP)的HTTP 安全传输实现,但是HTTPS 的广泛应用而成为事实上的HTTP 安全传输实现,S-HTTP 并没有得到广泛支持。

笔记

HTTP (Hyper Text Transfer Protoco I) 中文名叫作超文本传输协议用于从网络传输超文本数据到本地浏览器的传送协议,能保证高效而准确地传送超文本文档由万维网协会(World Wide Web Consortium) 和Internet 工作小组IETF (Internet Engineer ing Task Force) 共同合作制定的规范目前广泛使用的是HTTP 1.1 版本

HTTPS (Hyper Text Transfer Protocol over Secure Socket Layer) 是以安全为目标的HTTP 通道,简单讲是HTTP 的安全版,即HTTP 下加入SSL 层,简称为HTTPS 安全基础是SSL, 因此通过它传输的内容都是经过SSL 加密.

主要作用可以分为两种:

1、建立一个信息安全通道,来保证数据传输的安全

2、确认网站的真实性,凡是使用了HTTPS 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站

越来越多的网站和App 都已经向HTTPS 方向发展:

* 苹果公司强制所有iOS App 在 年1 月1 日前全部改为使用HTTPS 加密,否则App 就无法在应用商店上架

* 谷歌从 年1 月推出的Chrome 5 6 开始,对未进行HTTPS 加密的网址链接亮出风险提示,即在地址栏的显著位置提醒用户“此网页不安全”

* 腾讯微信小程序的官方需求文档要求后台使用HTTPS 请求进行网络通信,不道足条件的域名和协议无法请求。

HTTPS 已经已经是大势所趋。

HTTP 的URL 是由“http://”起始与默认使用端口80,而HTTPS 的URL 则是由“https://”起始与默认使用端口443。

HTTP 不是安全的,而且攻击者可以通过监听和中间人攻击等手段,获取网站帐户和敏感信息等。HTTPS 的设计可以防止前述攻击,在正确配置时是安全的。

五、HTTP 请求过程

在浏览器中输入一个URL, 回车之后便可以在浏览器中观察到页面内容这个过程是浏览器向网站所在的服务器发送了一个请求网站服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器.

图3: http 请求-响应模型

打开Chrome 浏览器,右击并选择“检查”项即可打开浏览器的开发者工具。

图4: http 请求的过程

1、Name: 请求的名称, 一般会把URL 的最后一部分当作名称

2、Status: 响应的状态码,一般200 表示响应成功,通过状态码,可以判断发送的请求是否获得正常响应

3、Type:请求的文档类型,document 表示这次的请求是一个html

4、Initiator: 请求源,用于标记请求是由那个对象或者端口发起的

5、Size: 从服务器,下载的文件和请求内容的大小,如果是从缓存中得到的则该列会显示from cash,

6、Time: 发起请求到获取响应的总时间

7、Waterfall: 网络请求的可视化瀑布流

点击一个进去可以查看到详细信息

1、General:HTTP 标头字段列表

2、Request Headers: 请求头信息

3、Response Headers: 响应头信息

4、Query String Parameters:查询字符串参数:其实就是get 请求中url 后面要带的参数。也就是说,向对应网址服务器传递这些参数就可以获得请求的内容。

5.1 General

HTTP 标头字段列表

1、Request URL: 请求的网址

2、Request Method: 请求方法

3、Status Code: 响应状态码

4、Remote Address:Remote Address 代表的是当前HTTP 请求的远程地址,即HTTP 请求的源地址。HTTP 协议在三次握手时使用的就是这个Remote Address 地址,在发送响应报文时也是使用这个Remote Address 地址。

5、Referrer Policy: 当用户在浏览器上点击一个链接时,会产生一个HTTP 请求,用于获取新的页面内容,而在该请求的报头中,会包含一个Referrer,用以指定该请求是从哪个页面跳转页来的,常被用于分析用户来源等信息。但是也有成为用户的一个不安全因素,比如有些网站直接将sessionid 或是token 放在地址栏里传递的,会原样不动地当作Referrer 报头的内容传递给第三方网站。所以就有了Referrer Policy,用于过滤Referrer 报头内容,目前是一个候选标准,不过已经

有部分浏览器支持该标准。具体的可查看这里。

笔记

Remote Address 代表的是当前HTTP 请求的远程地址,即HTTP 请求的源地址。HTTP 协议在三次握手时使用的就是这个Remote Address 地址,在发送响应报文时也是使用这个Remote Address 地址。因此,如果请求者伪造Remote Address 地址,他将无法收到HTTP 的响应报文,此时伪造没有任何意义。这也就使得Remote Address 默认具有防篡改的功能。如果Http 请求经过代理服务器转发,则这种情况,用户的真实ip 会丢失,所以才有了“X-Forwarded-For”的方式。

当你使用了代理时,web 服务器就不知道你的真实IP 了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for 的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web 服务器能获取到真实IP,X-Forwarded-For 是一个扩展头。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由Squid 这个缓存代理软件引入,用来表示HTTP 请求端真实IP,现在已经成为事实上的标准,被各大HTTP 代理、负载均衡等转发服务广泛使用,并被写入RFC 7239 (Forwarded HTTP Extension)标准之中。

X-Forwarded-For 请求头格式非常简单,就这样:X-Forwarded-For: client, proxy1, proxy2可以看到,XFF 的内容由「英文逗号+ 空格」隔开的多个部分组成,最开始的是离服务端最远的设备IP,然后是每一级代理设备的IP。

如果一个HTTP 请求到达服务器之前,经过了三个代理Proxy1、Proxy2、Proxy3,IP 分别为IP1、IP2、IP3,用户真实IP 为IP0,那么按照XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2 总结是:在使用nginx 等反向代理服务器的时候,是必须使用X-Forward-For 来获取用户IP 地址的(此时Remote Address 是nginx 的地址),因为此XForward-For 中的地址是由nginx 写入的,而nginx 是可信任的。不过此时要注意,要禁止web 对外提供服务。

5.2 请求方法(Request Method)

HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:

1、GET

向指定的资源发出“显示”请求。使用GET 方法应该只用在读取资料,而不应当被用于产生“副作用”的操作中,例如在网络应用程序中。其中一个原因是GET 可能会被网络爬虫等随意访问。参见安全方法。浏览器直接发出的GET 只能由一个url 触发。GET 上要在url之外带一些参数就只能依靠url 上附带querystring。

2、HEAD

与GET 方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

3、POST

向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。每次提交,表单的数据被浏览器用编码到HTTP 请求的body 里。浏览器发出的POST 请求的body主要有两种格式,一种是application/x-www-form-urlencoded 用来传输简单的数据,大概就是"key1=value1&key2=value2" 这样的格式。另外一种是传文件,会采用multipart/form-data格式。采用后者是因为application/x-www-form-urlencoded 的编码方式对于文件这种二进制的数据非常低效。

4、PUT

向指定资源位置上传其最新内容。

5、DELETE

请求服务器删除Request-URI 所标识的资源。

6、TRACE

回显服务器收到的请求,主要用于测试或诊断。

7、OPTIONS

这个方法可使服务器传回该资源所支持的所有HTTP 请求方法。用’*’ 来代替资源名称,向Web 服务器发送OPTIONS 请求,可以测试服务器功能是否正常运作。

8、CONNECT

HTTP/1.1 协议中预留给能够将连接改为隧道方式的代理服务器。通常用于SSL 加密服务器的链接(经由非加密的HTTP 代理服务器)。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

笔记

常见的请求方法有:GET 和POST 在浏览器中直接输入URL 并回车,便发起了一个GET请求,请求的参数会直接包含到URL 里例如:在百度中搜索P yth o n , 这就是一个GET 请求,链接为/s?wd=Python URL 中包含了请求的参数信息,这里参数wd 表示要搜寻的关键字

POST 请求大多在表单提交时发起例如:对于一个登录表单,输入用户名和密码后,点击其数据通常以表单的形式传输,而不会体现在URL 中“登录”按钮这通常会发起一个POST 请求

GET 和POST 请求方法有如下区别:

GET 请求中的参数包含在URL 里面,数据可以在URL 中看到,而POST 请求的URL 不会包含这些数据数据都是通过表单形式传输的,会包含在请求体中

GET 请求提交的数据最多只有1024 字节,而POST 请求没有限制

5.3 状态码(Status Code)

所有HTTP 响应状态代码都分为五个类或类别。状态码的第一位数字定义响应的类别,而最后两位数字没有任何分类或分类作用。该标准定义了五类:

1xx 信息响应–收到请求,继续进行

2xx 成功–成功接收,理解并接受了请求

3xx 重定向–为了完成请求,需要采取进一步的措施

4xx 客户端错误–请求包含错误的语法或无法满足

5xx 服务器错误–服务器无法满足看似有效的请求

状态码详细说明:

1、201-206 都表示服务器成功处理了请求的状态代码,说明网页可以正常访问。

(1)200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。

(2)201(已创建)请求成功且服务器已创建了新的资源。

(3)202(已接受)服务器已接受了请求,但尚未对其进行处理。

(4)203(非授权信息)服务器已成功处理了请求,但返回了可能来自另一来源的信息。

(5)204(无内容)服务器成功处理了请求,但未返回任何内容。

(6)205(重置内容)服务器成功处理了请求,但未返回任何内容。与204 响应不同,此响应要求请求者重置文档视图(例如清除表单内容以输入新内容)。

(7)206(部分内容)服务器成功处理了部分GET 请求。

2、300-3007 表示的意思是:要完成请求,您需要进一步进行操作。通常,这些状态代码是永远重定向的。

(1)300(多种选择)服务器根据请求可执行多种操作。服务器可根据请求者来选择一项操作,或提供操作列表供其选择。

(2)301(永久移动)请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。您应使用此代码通知搜索引擎蜘蛛网页或网站已被永久移动到新位置。

(3)302(临时移动)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原位置来进行以后的请求。会自动将请求者转到不同的位置。但由于搜索引擎会继续抓取原有位置并将其编入索引,因此您不应使用此代码来告诉搜索引擎页面或网站已被移动。

(4)303(查看其他位置)当请求者应对不同的位置进行单独的GET 请求以检索响应时,服务器会返回此代码。对于除HEAD 请求之外的所有请求,服务器会自动转到其他位置。

(5)304(未修改)自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。

如果网页自请求者上次请求后再也没有更改过,您应当将服务器配置为返回此响应。由于服务器可以告诉搜索引擎自从上次抓取后网页没有更改过,因此可节省带宽和开销。

(6)305(使用代理)请求者只能使用代理访问请求的网页。如果服务器返回此响应,那么,服务器还会指明请求者应当使用的代理。

(7)307(临时重定向)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。会自动将请求者转到不同的位置。但由于搜索引擎会继续抓取原有位并将其编入索引,因此您不应使用此代码来告诉搜索引擎某个页面或网站已被移动。

3、4XXHTTP 状态码表示请求可能出错,会妨碍服务器的处理。

(1)400(错误请求)服务器不理解请求的语法。

(2)401(身份验证错误)此页要求授权。您可能不希望将此网页纳入索引。

(3)403(禁止)服务器拒绝请求。

(4)404(未找到)服务器找不到请求的网页。例如,对于服务器上不存在的网页经常会返回此代码。例如:/0aaaa,就会进入404 错误页面

(5)405(方法禁用)禁用请求中指定的方法。

(6)406(不接受)无法使用请求的内容特性响应请求的网页。

(7)407(需要代理授权)此状态码与401 类似,但指定请求者必须授权使用代理。如果服

务器返回此响应,还表示请求者应当使用代理。

(8)408(请求超时)服务器等候请求时发生超时。

(9)409(冲突)服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。服务器在响应与前一个请求相冲突的PUT 请求时可能会返回此代码,以及两个请求的差异列表。

(10)410(已删除)请求的资源永久删除后,服务器返回此响应。该代码与404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时会用来替代404 代码。如果资源已永久删除,您应当使用301 指定资源的新位置。

(11)411(需要有效长度)服务器不接受不含有效内容长度标头字段的请求。

(12)412(未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件。

(13)413(请求实体过大)服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。

(14)414(请求的URI 过长)请求的URI(通常为网址)过长,服务器无法处理。

(15)415(不支持的媒体类型)请求的格式不受请求页面的支持。

(16)416(请求范围不符合要求)如果页面无法提供请求的范围,则服务器会返回此状态码。

(17)417(未满足期望值)服务器未满足" 期望" 请求标头字段的要求。

4、500 至505 表示的意思是:服务器在尝试处理请求时发生内部错误。这些错误可能是服务

器本身的错误,而不是请求出错。

(1)500(服务器内部错误)服务器遇到错误,无法完成请求。

(2)501(尚未实施)服务器不具备完成请求的功能。例如,当服务器无法识别请求方法时,服务器可能会返回此代码。

(3)502(错误网关)服务器作为网关或代理,从上游服务器收到了无效的响应。

(4)503(服务不可用)目前无法使用服务器(由于超载或进行停机维护)。通常,这只是一种暂时的状态。

(5)504(网关超时)服务器作为网关或代理,未及时从上游服务器接收请求。

(6)505(HTTP 版本不受支持)服务器不支持请求中所使用的HTTP 协议版本。

5.4 请求头信息(Request Headers)

请求头信息用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-

Agent。

GET /home.html HTTP/1.1Host: User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/0101Firefox/50.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflate, brReferer: /testpage.htmlConnection: keep-aliveUpgrade-Insecure-Requests: 1If-Modified-Since: Mon, 18 Jul 02:36:04 GMTIf-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"Cache-Control: max-age=0

请求头由key/value 对组成,每行为一对,key 和value 之间通过冒号(:) 分割。请求头的作用

主要用于通知服务端有关于客户端的请求信息

1、Accept:浏览器可接受的MIME 类型;

2、Accept-Charset:浏览器可接受的字符集;

3、Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet 能够向支持gzip的浏览器返回经gzip 编码的HTML 页面。许多情形下这可以减少5 到10 倍的下载时间;

4、Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;

5、Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate 头的应答中;

6、Connection:表示是否需要持久连接。如果Servlet 看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1 默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet 需要在应答中发送一个Content-Length 头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

7、Content-Length:表示请求消息正文的长度;

8、Cookie:这是最重要的请求头信息之一;也常用复数形式Cookies, 这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据它的主要功能是维持当前访问会话。例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是Cookies 的功劳Cookies 里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上Cookies 并将其发送给服务器,服务器通过Cookies 识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登录之后才能看到的网页内容

9、From:请求发送者的email 地址,由一些特殊的Web 客户程序使用,浏览器不会用到它;

10、Host:初始URL 中的主机和端口;

11、If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答;

12、Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;

13、Referer:包含一个URL,用户从该URL 代表的页面出发访问当前请求的页面。此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理如做来源统计、防盗链处理等

14、User-Agent:浏览器类型,如果Servlet 返回的内容与浏览器类型有关则该值非常有用;简称UA , 它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别出为爬虫

15、UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE 浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU 类型。

5.5 响应头信息(Response Headers)

响应报文:当收到get 或post 等方法发来的请求后,服务器就要对报文进行响应。

200 OKAccess-Control-Allow-Origin: *Connection: Keep-AliveContent-Encoding: gzipContent-Type: text/html; charset=utf-8Date: Mon, 18 Jul 16:06:00 GMTEtag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"Keep-Alive: timeout=5, max=997Last-Modified: Mon, 18 Jul 02:36:04 GMTServer: ApacheSet-Cookie: mykey=myvalue; expires=Mon, 17-Jul- 16:06:00 GMT; Max-Age=31449600;Path=/; secureTransfer-Encoding: chunkedVary: Cookie, Accept-EncodingX-Backend-Server: developer2.webapp.X-Cache-Info: not cacheable; meta data too largeX-kuma-revision: 1085259x-frame-options: DENY

1、Allow:服务器支持哪些请求方法(如GET、POST 等);

2、Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type 头指定的内容类型。利用gzip 压缩文档能够显著地减少HTML文档的下载时间。Java 的GZIPOutputStream可以很方便地进行gzip 压缩,但只有Unix 上的Netscape 和Windows 上的IEIE

5 才支持它。因此,Servlet 应该通过查看Accept-Encoding 头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip 的浏览器返回经gzip 压缩的HTML 页面,为其他浏览器返回普通页面;

3、Content-Length:表示内容长度。只有当浏览器使用持久HTTP 连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length 头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容;

4、Content-Type:表示后面的文档属于什么MIME 类型。Servlet 默认为text/plain,但通常需显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse 提供了一个专用的方法setContentTyep。可在web.xml 文件中配置扩展名和MIME 类型的对应关系;

5、Date:当前的GMT 时间。你可以用setDateHeader 来设置这个头以避免转换时间格式的麻烦;

6、Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它。

7、Last-Modified:文档的最后改动时间。客户可以通过If-Modified-Since 请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified 也可用setDateHeader 方法来设置;

8、Location:表示客户应当到哪里去提取文档。Location 通常不是直接设置的,而是通过HttpServletResponse的sendRedirect 方法,该方法同时设置状态代码为302;

9、Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path") 让浏览器读取指定的页面。注意这种功能通常是通过设置HTML 页面HEAD 区的<META HTTP-EQUIV="Refresh" CONTENT="

5;URL=http://host/path"> 实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet 的HTML 编写者十分重要。但是,对于Servlet 来说,直接设置Refresh 头更加方便。注意Refresh 的意义是“N 秒之后刷新本页面或访问指定页面”,而不是“每隔N 秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh 头,而发送204 状态代码则可以阻止浏览器继续刷新,不管是使用Refresh 头还是<META HTTP-EQUIV="Refresh"...>。注意Refresh 头不属于HTTP 1.1 正式规范的一部分,而是一个扩展,但Netscape 和IE都支持它。

5.6 响应体(Response Body)

最重要的当属响应体的内容,响应的正文数据都在响应体中比如:

请求网页时,它的响应体就是网页的HTML 代码

请求一张图片时,它的响应体就是图片的二进制数据

六、Cookies 和session

6.1 Cookies

HTTP Cookie(也叫Web Cookie 或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的HTTP 协议记录稳定的状态信息成为了可能。

Cookie 主要用于以下三个方面:

1、会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

2、个性化设置(如用户自定义设置、主题等)

3、浏览器行为跟踪(如跟踪分析用户行为等)

Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定Cookie 后,浏览器的每次请求都会携带Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API 已经允许开发者直接将数据存储到本地,如使用Web storage API (本地存储和会话存储)或IndexedDB 。

6.2 session

session 是另一种记录服务器和客户端会话状态的机制session 是基于cookie 实现的,session存储在服务器端,sessionId 会被存储到客户端的cookie 中

session 认证流程:

1、用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的Session

2、请求返回时将此Session 的唯一标识信息SessionID 返回给浏览器浏览器接收到服务器返回的SessionID 信息后,会将此信息存入到Cookie 中,同时Cookie 记录此SessionID 属于哪个域名

3、当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在Cookie 信息,如果存在自动将Cookie 信息也发送给服务端,服务端会从Cookie 中获取SessionID,再根据SessionID查找对应的Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到Session 证明用户已经登录可执行后面操作。

根据以上流程可知,SessionID 是连接Cookie 和Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

6.3 Cookies 和session 区别

Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies 是当你浏览某网站时,由Web 服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。session:当用户请求来自应用程序的Web 页时,如果该用户还没有会话,则Web 服务器将自动创建一Session 对象。当会话过期或被放弃后,服务器将终止该会话。cookie 机制:采用的是在客户端保持状态的方案,而session 机制采用的是在服务端保持状态的方案。同时我们看到由于服务器端保持状态的方案在客户端也需要保存一个标识,所以session 机制可能需要借助cookie 机制来达到保存标识的目的。

Session是服务器用来跟踪用户的一种手段,每个Session 都有一个唯一标识:session ID。当服务器创建了Session 时,给客户端发送的响应报文包含了Set-cookie 字段,其中有一个名为sid的键值对,这个键值Session ID。客户端收到后就把Cookie 保存浏览器,并且之后发送的请求报表都包含SessionID。HTTP 就是通过Session 和Cookie 这两个发送一起合作来实现跟踪用户状态,Session 用于服务端,Cookie 用于客户端。

想了解更多爬虫内容可移步:Python网络爬虫教程详解.pdf_python网页爬虫教程-互联网文档类资源-CSDN下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。