热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python爬虫_HTTP标准

文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务


文章目录

      • 简介
      • HTTP请求过程
      • HTTP状态码含义
      • HTTP头部信息
      • COOKIE状态管理
      • HTTP请求方式


简介

HTTP协议(超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,减少网络传输。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先与图形)等。之后的Python爬虫开发,主要就是和HTTP协议打交道


HTTP请求过程

HTTP协议采取的是请求响应模型,HTTP协议永远都是客服端发起请求,服务器回送响应。HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求没有对应关系。一次HTTP操作称为一个事务,其执行过程可分为四步:
1、首先客服端与服务端需要建立连接,例如单击某个超链接,HTTP的工作就开始了

2、建立连接后,客户端发送一个请求个服务器,请求方式的格式为统一资源标识符(URL)、协议版本号,后边是MIME信息,包括请求修饰符、客户机信息和可能的内容

3、服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息,包括服务器信息、实体信息和可能的内容

4、客户端接受服务器所返回的信息,通过浏览器将信息显示在用户的显示屏上,然后客户端与服务断开连接

如果以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,在显示屏输出,这些过程是由HTTP协议自己完成的


HTTP状态码含义

当浏览器访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。在浏览器接受并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。HTTP状态码主要是为了标识此次HTTP请求的运行状态。下面是常见的HTTP状态码

200——请求成功
301——资源(网页等)被永久转移到其他URL
404——请求的资源(网页等)不存在
500——内部服务器错误

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。HTTP状态码共分5种类型


HTTP状态码


分类分类描述
1**信息,服务器收到请求,需要请求中继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

HTTP头部信息

HTTP头部信息由众多的头域组成,每个头域由一个域名、冒号(: ) 和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符

通过浏览器访问百度首页时,鼠标右键选择检查,选择Network,在里面可以监控整个HTTP访问的过程。下面就以访问百度的HTTP请求进行分析,首先是浏览器发出请求,请求头的数据如下:

Request Headers

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://www.google.com.hk/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
COOKIE: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

在请求头中包含一下内容:
GET 代表的是请求方式,HTTP/1.1协议标准

Host 头域,用于指定请求资源的Intent主机和端口,必须表示请求URL的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域(Host),否则系统会以400状态码返回

User-Agent 头域,里面包含发出请求的用户信息,其中有使用的浏览器型号、版本和操作系统的信息。这个头域经常用来作为反爬虫的措施

Accept 请求报头域,用于指定客户端接受哪些类型的信息。例如:Accept: image/gif,表名客户端希望接受GIF图像格式的资源;Accept: text/html,表明客户端希望接受HTML文本

Accept-Language 请求报头域,类似于Accept,但是它用于指定一种自然语言。例如:Accept-Language: zh-cn,如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受

Accept-Encoding 请求报头域,类似于Accept,但是它用于指定可接受的内容编码。例如:Accept-Encoding: gzip, deflate。如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受

Connection 报头域允许发送用于指定连接的选项。Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。例如指定连接的状态时连续,或者指定 “close” 选项,通知服务器,在响应完成后,关闭连接

Cache-Control 用于指定请求和响应遵循缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached。各个消息中的指令含义如下:


  • no-cache指示请求或响应消息不能缓存
  • no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存
  • max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应
  • min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应
  • max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息

Referer 告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理

Upgrade-Insecure-Requests 为1,则是告诉服务器,浏览器可以处理HTTPS协议

If-Modified-Since 头域用于在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端收到之后,就直接把本地缓存文件显示到浏览器中。如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端收到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中

❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️
请求发送成功后,服务器进行响应,接下来看一下响应头信息,数据如下:

HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xd4260a8d00020fb2
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Cxy_all: baidu+6d4cb652e4bd8d6f9eae9891a67cd1a7
Date: Fri, 19 Oct 2018 09:01:59 GMT
Expires: Fri, 19 Oct 2018 09:01:45 GMT
Server: BWS/1.1
Set-COOKIE: delPer=0; path=/; domain=.baidu.com
Set-COOKIE: BDSVRTM=0; path=/
Set-COOKIE: BD_HOME=0; path=/
Set-COOKIE: H_PS_PSSID=1429_21108_26350; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked

响应头中包含以下内容:
HTTP/1.1 表示使用HTTP1.1协议标准,200 OK 说明请求成功

Date 表示消息产生的日期和时间

Content-Type 实体报头域用于指明发送给接受者的实体正文的媒体类型。text/html; charset=utf-8 代表HTML文本文档,UTF-8 编码

Transfer-Encoding: chunked 表示输出的内容长度不能确定

Connection 报头域允许发送用于指定连接的选项。例如指定连接的状态是连续,或者指定“close” 选项,通知服务器,在响应完成后,关闭连接

Vary 头域指定了一些请求头域,这些请求头域用来决定当缓存中存在一个响应,并且该缓存没有过期失效时,是否被允许利用此响应去恢复后续请求而不需要重复验证

Cache-Control 用于指定缓存指令,缓存指令是单向的,且是独立的。响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age


  • Public指示响应可被任何缓存区缓存
  • Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

Expires 实体报头域给出响应过期的日期和时间。 为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间

Last-Modified 实体报头域用于指示资源的最后修改日期和时间

Content-Encoding 实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用响应的解码机制。

Set-COOKIE setCOOKIE() 函数向客户端发送一个 HTTP COOKIE。COOKIE 是由服务器发送到浏览器的变量。COOKIE 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 COOKIE

HTTP消息报头只要包括普通报头、请求报头、响应报头、实体报头
1、在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用与被传输的实体,只用于传输的消息

2、请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息

3、响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URL所标识的资源进行下一步访问的信息

4、请求和响应消息都可以传送一个实体。一个实体由一个实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发实体报头域。实体报头定义了关于实体正文和请求所标识的资源的原信息


常见普通报头

头域含义
Cache-Control用于指定缓存指令
Date表示消息产生的日期和时间
Connection允许发送用于指定连接的选项,利于指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接

常见请求报头

头域含义
Accept用于指定客户端接受哪些类型的信息
Accept-Charset用于指定客户端接受的字符串
Accept-Encoding用于指定可接受的内容编码
Accept-Language用于指定一种自然语言
Authorzation用于证明客户端有权查看某个资源
Host用于指定被请求资源的Intent主机和端口号,它通常从HTTP URL中提取出来
User-Agent允许客户端将它的操作系统,浏览器和其他属性告诉服务器

常见响应报头

头域含义
Location用于重定向接受者到一个新URL地址
Server包含了服务器用来处理请求的软件信息,与User-Agent请求报头域是相对应的
WWW-Authenticate此响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息,并发动Authorzation报头域请求服务器对其进行验证时,,服务器端响应报头就包含该报头域

常见实体报头

头域含义
Content-Encoding被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码
Content-Language描述资源所用的自然语言
Content-Length用于指明实体正文的长度,以字节方式存储的十进制数字来表示
Content-Type用于指明发送给接受者的实体正文的媒体类型
Last-Modified用于指示资源的最后修改日期和时间
Expires给出响应过期的日期和时间

COOKIE状态管理

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是COOKIE的工作原理

COOKIE和Session都用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题所做的努力。对于爬虫开发来说,我们更加关注的是COOKIE,因为COOKIE将状态保存在客户端,Session将状态保存在服务器端

COOKIE实际上是一小段的文本信息

COOKIE是服务器在本地机器(客户端)上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送COOKIE,浏览器则会解析这些COOKIE并将它们保存为一个本地文件,它会自动将同一服务器的任何请求绑定上这些COOKIE

客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个COOKIE。客户端浏览器会把COOKIE保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该COOKIE一同提交给服务器。服务器检查该COOKIE,以此来辨认用户状态。服务器还可以根据需要修改COOKIE的内容。

Session是另一种记录客户状态的机制

COOKIE的工作方式:服务器给每个Session分配一个唯一的JESSION-ID,并通过COOKIE发送给客户端。当客户端发起新的请求的时候,将在COOKIE头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session

不同的是COOKIE保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说COOKIE机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了


HTTP请求方式

HTTP的请求方法包括如下几种:
1、GET :请求指定的页面信息,并返回实体主体

2、POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或者已有资源的修改

3、HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

4、PUT:从客户端向服务器传送的数据取代指定的文档的内容

5、DELETE:请求服务器删除指定的页面

6、OPTIONS:允许客户端查看服务器的性能

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

8、CONNECT:HTTP/1.1协议中预留给能将连接改为管道方式的代理服务器

其中常用的请求方式是GET和POST:
GET 方式:是以实体的方式得到由请求URL所指定资源的信息,如果请求URL只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的描述
POST方式:用来向目的服务器发出请求,要求它接受被附加在请求后的实体,并把它当作请求队列中请求URL 所指定资源的附加新子项

GET与POST的区别:
在客户端,GET方式通过URL提交数据,数据在URL中可以看到;POST方式,数据处置在实体去内提交

GET方法提交的数据最多只能由1024字节,而POST则没有此限制

安全问题,使用GET的时候,参数会显示在地址栏上,而POST不会。所以,如果这些数据是非敏感数据,那么使用GET;如果用户输入的数据包含敏感数据,那么还是使用POST为好

GET请求在访问网页时很常见,POST请求则是常用在登录框、提交框的位置


推荐阅读
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • 在今天的实践中,我深入学习了网页图像抓取技术,通过编写爬虫程序批量获取网站上的图片资源。具体来说,我选择了一个包含大量高质量图片的网站作为练习对象,并成功实现了将这些图片批量下载到本地存储。这一过程不仅提升了我对爬虫技术的理解,还增强了我的编程能力。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • 在第10天的夜灵HTML日志中,我们深入探讨了浏览器兼容性和高级选择器的应用。CSS3引入了许多新属性,但在旧版浏览器中的支持情况并不理想。然而,目前主流浏览器的最新版本已全面支持这些新特性。对于那些不支持CSS3新属性的浏览器,我们提供了多种解决方案,以确保网站在不同环境下的兼容性和用户体验。此外,我们还详细讨论了如何利用高级选择器提升页面布局的灵活性和可维护性。 ... [详细]
  • 在Python编程中,探讨了并发与并行的概念及其区别。并发指的是系统同时处理多个任务的能力,而并行则指在同一时间点上并行执行多个任务。文章详细解析了阻塞与非阻塞操作、同步与异步编程模型,以及IO多路复用技术的应用。通过模拟socket发送HTTP请求的过程,展示了如何创建连接、发送数据和接收响应,并强调了默认情况下socket的阻塞特性。此外,还介绍了如何利用这些技术优化网络通信性能和提高程序效率。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 七款高效编辑器与笔记工具推荐:KindEditor自动换行功能解析
    本文推荐了七款高效的编辑器与笔记工具,并详细解析了KindEditor的自动换行功能。其中,轻笔记QingBiJi是一款完全免费的记事本软件,用户可以通过其简洁的界面和强大的功能轻松记录和管理日常事务。此外,该软件还支持多平台同步,确保用户在不同设备间无缝切换。 ... [详细]
  • 在使用 `requests` 库进行 HTTP 请求时,如果遇到 `requests.exceptions.SSLError: HTTPSConnectionPool` 错误,通常是因为 SSL 证书验证失败。解决这一问题的方法包括:检查目标网站的 SSL 证书是否有效、更新本地的 CA 证书库、禁用 SSL 验证(不推荐用于生产环境)或使用自定义的 SSL 上下文。此外,确保 `requests` 库和相关依赖项已更新到最新版本,以避免潜在的安全漏洞。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 如何在 Angular 4 中实现跨域调用百度人脸识别 API? ... [详细]
  • CSS中的pointer-events属性详解与应用
    在CSS中,`pointer-events`属性是一个非常实用但常被忽视的功能。它主要用于控制元素是否响应鼠标事件。当一个元素覆盖在其他元素之上时,通过设置`pointer-events`属性,可以决定该元素是否能够接收鼠标点击、悬停等交互操作,从而实现更灵活的用户界面设计。例如,将`pointer-events`设置为`none`可以使元素透明地传递鼠标事件,方便实现复杂的叠加效果和交互逻辑。 ... [详细]
author-avatar
成都迅捷代驾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有