《Python爬虫开发与项目实战》——2.2 HTTP标准

简介:

本节书摘来自华章计算机《Python爬虫开发与项目实战》一书中的第2章,第2.2节,作者:范传辉著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.2 HTTP标准

  HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,减少网络传输。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。之后的Python爬虫开发,主要就是和HTTP协议打交道。
2.2.1 HTTP请求过程
  HTTP协议采取的是请求响应模型,HTTP协议永远都是客户端发起请求,服务器回送响应。模型如图2-8所示。

screenshot

  HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求没有对应关系。一次HTTP操作称为一个事务,其执行过程可分为四步:

  • 首先客户端与服务器需要建立连接,例如单击某个超链接,HTTP的工作就开始了。
  • 建立连接后,客户端发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息,包括请求修饰符、客户机信息和可能的内容。
  • 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息,包括服务器信息、实体信息和可能的内容。
  • 客户端接收服务器所返回的信息,通过浏览器将信息显示在用户的显示屏上,然后客户端与服务器断开连接。
      如果以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,在显示屏输出,这些过程是由HTTP协议自己完成的。

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

  • 200——请求成功。
  • 301——资源(网页等)被永久转移到其他URL。
  • 404——请求的资源(网页等)不存在。
  • 500——内部服务器错误。
      HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。HTTP状态码共分为5种类型,如表2-9所示。

screenshot

  全部的HTTP状态码的信息,请大家查询HTTP协议标准手册。
2.2.3 HTTP头部信息
  HTTP头部信息由众多的头域组成,每个头域由一个域名、冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
  通过浏览器访问博客园首页时,使用F12打开开发者工具,里面可以监控整个HTTP访问的过程。下面就以访问博客园的HTTP请求进行分析,首先是浏览器发出请求,请求头的数据如下:

GET / HTTP/1.1
    Host: www.cnblogs.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    If-Modified-Since: Sun, 30 Oct 2016 10:13:18 GMT

  在请求头中包含以下内容:

  • GET代表的是请求方式,HTTP/1.1表示使用HTTP 1.1协议标准。
  • Host头域,用于指定请求资源的Intenet主机和端口号,必须表示请求URL的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以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报头域允许发送用于指定连接的选项。例如指定连接的状态是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接。
  • If-Modified-Since头域用于在发送HTTP请求时,把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端收到之后,就直接把本地缓存文件显示到浏览器中。如果时间不一致,就返回HTTP状态码200和新的文件内容,客户端收到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
      请求发送成功后,服务器进行响应,接下来看一下响应的头信息,数据如下:

screenshot

  响应头中包含以下内容:

  • HTTP/1.1表示使用HTTP 1.1协议标准,200 OK说明请求成功。
  • Date表示消息产生的日期和时间。
  • Content-Type实体报头域用于指明发送给接收者的实体正文的媒体类型。text/html; charset=utf-8代表HTML文本文档,UTF-8编码。
  • Transfer-Encoding:chunked表示输出的内容长度不能确定。
  • Connection报头域允许发送用于指定连接的选项。例如指定连接的状态是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接。
  • Vary头域指定了一些请求头域,这些请求头域用来决定当缓存中存在一个响应,并且该缓存没有过期失效时,是否被允许利用此响应去回复后续请求而不需要重复验证。
  • Cache-Control用于指定缓存指令,缓存指令是单向的,且是独立的。请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。
  • Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。
  • Last-Modified实体报头域用于指示资源的最后修改日期和时间。
  • Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
      从上面分析的过程中,大家基本上了解了请求和响应的头信息,最后进行一下总结:

  HTTP消息报头主要包括普通报头、请求报头、响应报头、实体报头。具体如下:
  1)在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
  2)请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
  3)响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
  4)请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文和请求所标识的资源的元信息。
  通过表2-10~表2-13对报文头进行分类列举说明。
screenshot
screenshot

2.2.4 Cookie状态管理
  Cookie和Session都用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题所做的努力。对于爬虫开发来说,我们更加关注的是Cookie,因为Cookie将状态保存在客户端,Session将状态保存在服务器端。
  Cookie是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送Cookie,浏览器则会解析这些Cookie并将它们保存为一个本地文件,它会自动将同一服务器的任何请求绑定上这些Cookie。
  Cookie的工作方式:服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session,流程如图2-9所示。
screenshot

2.2.5 HTTP请求方式
  HTTP的请求方法包括如下几种:

  • GET
  • POST
  • HEAD
  • PUT
  • DELETE
  • OPTIONS
  • TRACE
  • CONNECT
      其中常用的请求方式是GET和POST:
  • GET方式:是以实体的方式得到由请求URL所指定资源的信息,如果请求URL只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。
  • POST方式:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求URL所指定资源的附加新子项。
    GET与POST方法有以下区别:
  • 在客户端,Get方式通过URL提交数据,数据在URL中可以看到:POST方式,数据放置在实体区内提交。
  • GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
  • 安全性问题。使用Get的时候,参数会显示在地址栏上,而Post不会。所以,如果这些数据是非敏感数据,那么使用Get;如果用户输入的数据包含敏感数据,那么还是使用Post为好。
      在爬虫开发中基本处理的也是GET和POST请求。GET请求在访问网页时很常见,POST请求则是常用在登录框、提交框的位置。下面展示一个完整的POST请求,这是登录知乎社区时捕获的请求,上面一部分是请求头,下面全部加粗的数据是请求实体。请求内容如下:

screenshot
screenshot

相关文章
|
5月前
|
存储 监控 算法
淘宝买家秀 API开发实录Python(2025)
本文讲述了作者在电商开发领域,尤其是对接淘宝买家秀 API 接口过程中所经历的挑战与收获。从申请接入、签名验证、频率限制到数据处理和实时监控,作者分享了多个实战经验与代码示例,帮助开发者更高效地获取和处理买家秀数据,提升开发效率。
|
8月前
|
API C++ 开发者
PySide vs PyQt:Python GUI开发史诗级对决,谁才是王者?
PySide 和 PyQt 是 Python GUI 开发领域的两大利器,各有特色。PySide 采用 LGPL 协议,更灵活;PyQt 默认 GPL,商业使用需授权。两者背后团队实力雄厚,PySide 得到 Qt 官方支持,PyQt 由 Riverbank Computing 打造。API 设计上,PySide 简洁直观,贴近原生 Qt;PyQt 增加 Pythonic 接口,操作更高效。性能方面,两者表现优异,适合不同需求的项目开发。选择时可根据项目特点与开源要求决定。
904 20
|
4月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
638 7
|
9月前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比
|
7月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
417 61
|
8月前
|
数据采集 安全 网络安全
使用aiohttp实现异步HTTPS爬虫的SSL优化
使用aiohttp实现异步HTTPS爬虫的SSL优化
452 81
|
9月前
|
Linux C语言 iOS开发
C语言结合AWTK开发HTTP接口访问界面
这样,我们就实现了在C语言中使用libcurl和AWTK来访问HTTP接口并在界面上显示结果。这只是一个基础的示例,你可以根据需要添加更多的功能和优化。例如,你可以添加错误处理机制、支持更多HTTP方法(如POST、PUT等)、优化用户界面等。
499 82
|
7月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
371 18
|
5月前
|
算法 程序员 API
电商程序猿开发实录:淘宝商品python(2)
本文分享了开发者在对接淘宝商品详情API过程中的真实经历,涵盖权限申请、签名验证、限流控制、数据解析及消息订阅等关键环节,提供了实用的Python代码示例,帮助开发者高效调用API,提升系统稳定性与数据处理能力。
|
6月前
|
数据采集 存储 数据库
Python爬虫开发:Cookie池与定期清除的代码实现
Python爬虫开发:Cookie池与定期清除的代码实现

热门文章

最新文章

推荐镜像

更多