2 网络爬虫基础
2.1 HTTP
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
2.11 HTTP请求过程
HTTP协议采取的是请求响应模型,HTTP协议永远是客户端发起请求,服务器回送响应。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求没有对应关系。 一次HTTP操作称为一个事务,其执行过程可分为四步:
首先客户端与服务器需要建立连接,例如单击某个超链接,HTTP的工作就开始了。
建立连接后,客户端发送一个请求给服务器,请求方式的格式为:统一资源标识符 (URL )、协议版本号,后边是MIME信息,包括请求修饰符、客户机信息和可能的 内容。
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版 本号、一个成功或错误的代码,后边是MIME信息,包括服务器信息、实体信息和可 能的内容。
客户端接收服务器所返回的信息,通过浏览器将信息显示在用户的显示屏上,然后客 户端与服务器断开连接。
如果以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,在显示屏输 出,这些过程是由HTTP协议自己完成的。
2.12 请求报文
一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。
1、请求行
请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。
2、请求方法
HTTP/1.1 定义的请求方法有8种:GET(完整请求一个资源)、POST(提交表单)、PUT(上传文件)、DELETE(删除)、PATCH、HEAD(仅请求响应首部)、OPTIONS(返回请求的资源所支持的方法)、TRACE(追求一个资源请求中间所经过的代理)。最常的两种GET和POST。
(1)GET
当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,会送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号‘?’代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。显然这种方式不适合传送私密数据。
(2)GET
允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。
3、URL
URL是统一资源定位符,是一种资源位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>。如http://www.cqie.edu.cn/index.html。协议为http,主机为www.cqie.edu.cn,端口缺省为80端口,可以省略。Index.html为路径有时也可省略。
4、协议版本
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
5、请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。
请求头 说明 HOST 接受请求的服务器地址,可以是IP:端口号,也可以是域名。如www.cqie.edu.cn
User-Agent 用户代理,编写爬虫至关重要。如Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88
Safari/537.36 Connection 指定与连接相关的属性,如Connection:Keep-Altve
Accept-Charset 通知服务端可以发送的编码格式 Accept-Encoding 通知服务端可以发送的数据压缩格式。如gzip,
deflate Accept-Language 通知服务端可以发送的语言。如zh-CN,zh;q=0.9
Referer 页面跳转处,表明产生请求的网页来自于哪个URL,用户是从该
Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的。
Cookie Cookie其实就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。 服务器在接收到Cookie以后,会验证Cookie的信息,以此来辨别用户的身份。类似于通行证。
6、请求数据
请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头部是Cntent-Type和Content-Length
2.13 响应报文
HTTP响应报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成。
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。在浏览器接 收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header) 用以响应浏览器的请求。HTTP状态码主要是是为了标识此次HTTP请求的运行状态。下面是常见的HTTP状态码:
200——请求成功。 301——资源(网页等)被永久转移到其他URL。 404——请求的资源(网页等)不存在。 500——内部服务器错误。
查看请求返回的状态码要结合浏览器的开发者工具。F12打开开发者工具,选择Network,刷新页面,选择需要查看的请求,点击Headers选项卡,在General中查看Status Code。
2.2 CSS
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。
2.21 CSS选择器
网络爬虫开发中用到的CSS选择器,不是为了控制页面元素的显示外观,而是为了选择元素,获取爬取内容。CSS选择器包括元素选择器、类选择器、ID选择器、属性选择器、组合选择器五大类。以下内容以百度首页为例,结合开发者工具进行说明。
1、元素选择器
在HTML文档中该选择器通常是指某种HTML元素,例如:p,h2,span,a,div乃至html。使用元素选择器时只需要输入标签的名称。
Chrome浏览器中输入百度的网址,F12打开开发者工具,切换到Elements选择卡。Ctrl+F打开查找对话框。在对话框中输入“div”,观察效果。元素选择器的选择结果一般都是多个,当前页面有25个结果,当前div为第4个。
2、类选择器
通过对元素添加Class属性,实现对同类元素外观的进行更精确的控制。选取时使用点“.”来进行查找。类选择器的选择结果一般也是多个。
3、ID选择器
ID 选择器允许以一种独立于文档元素的方式来指定样式。ID值在一般在当前页面是唯一的,以#号作为标识。
4、属性选择器
属性选择器可以根据元素的属性及属性值来选择元素。使用[]来约定属性。
5、组合选择器
css 的标签是可嵌套的,所以经常会有选择标签下的子标签和同级的兄弟标签的情况。
根据具体的需求来选择标签。
表达嵌套关系的选择器:
后代选择器:如 div p { },会将在div里的所有p元素都进行样式修改
子元素选择器div > p { },只会选择直接的子元素,例如这个
如果被包围的时候就不会产生效果。
这两种选择器的差别:就是看是否要选择所有子元素