Python爬虫(二)Request请求与响应

HTTP和HTTPS

HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
由于HTTP协议传输的数据都是明文未加密的,虽然效率高,但是使用传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
HTTPS协议是由HTTP+SSL(安全套接字层)构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。

HTTP协议请求

在这部分中,以Chrome中的百度为例,讲述浏览器请求中对Python爬虫比较重要的几个元素。

url

右击界面,点击“检查”,再讲页签切换到NetWork下,点击我们的请求,可以在右侧方框内看到我们的Request URL。URL = 请求的协议(http/https)+网站的域名(www.baidu.com)+资源的路径+参数。

Chrome检查界面.png

很多同学会觉得疑惑,为什么我们刚刚只是请求了一个域名,但是左侧的请求框里,却出现了很多请求。这是因为我们请求的时候不光请求了URL地址的数据,还请求了图片、JS、CSS等,渲染之后就是Element页签下的内容,也就是页面上我们看到的内容。
由此可见,Element = 当前URL对应的响应+JS+CSS+图片。然而,我们的爬虫程序只会请求到当前地址的响应,是不会发送 JS、CSS以及图片的请求,所以爬虫需要以当前URL地址对应的响应为准提取数据。(即以NetWork下的Response为准,不以Element为准)

Request Headers(请求头)

查看NetWork下的Request Headers,点击view source,显示如下:

Request Headers.png
  • 第一部分是请求行,包括了请求的方法(GET/POST),请求的参数以及请求的协议及其版本号,这一部分我们只需重点关注请求方法是GET还是POST就可以了。
  • 第二部分是HOST,即域名。
  • 第三部分是User-Agent,这一部分非常关键。我们可以将其翻译为用户代理,也可以理解成生产标识。不同的版本、不同的浏览器,都有一个User-Agent,对方服务器通过User-Agent可以知道当前是什么资源在发起请求,所以爬虫程序要模拟浏览器发送请求时,也该包含这一部分的参数。
  • 第四部分是Cookie。Cookie是浏览器保存在本地的用户信息,之所以要在这里讲,有两个方面原因。第一方面是我们要请求需要登录之后才能访问的网站,需要处理cookie的内容;第二方面是对方服务器经常通过是否携带cookie来判断我们是否是一个爬虫程序。
Request Body(请求体)

在这个例子中,你会好奇为什么只有请求头,而没有请求体。这是因为GET请求将参数数据放在了URL中,而POST请求参数是放在请求Body里的。
关于GET请求和POST请求的区别,这里简单的总结一下:

  • GET和POST本质上都是TCP链接,并无差别。只是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
  • GET请求的URL传参有长度限制,而POST请求没有长度限制。关于URL的限制,更多的是浏览器和服务器的限制,不同的浏览器和服务器限制的URL长度不一致。
  • GET产生一个TCP数据包,POST产生两个TCP数据包。浏览器请求TCP链接(第一次握手),服务器确认链接(第二次握手)之后,对于GET请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送Header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。
    在这里需要强调的是,Header 和 Body 分开发送是部分浏览器或框架的请求方法,不属于 POST 必然行为。Firefox就只发送一次。
    据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

HTTP响应

响应状态

有多种响应状态,

  • 1xx消息——请求已被服务器接收,继续处理;
  • 2xx成功——请求已成功被服务器接收、理解、并接受;
  • 3xx重定向——需要后续操作才能完成这一请求;
  • 4xx请求错误——请求含有词法错误或者无法被执行;
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误。
响应头和响应体

HTTP响应分为响应头和响应体。在响应头中,我们需要关注Set-Cookie,对方服务器通过该子段设置Cookie到本地上;在响应体中,我们要爬的应该是URL地址对应的响应(NetWork下的Response),而不是经过JS、CSS以及图片渲染后的响应(Element)。