声明
文章仅供学习与交流!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!
一、何为爬虫
爬虫(Crawler)是一种按照既定规则,在网络上自动爬取信息的程序或脚本,也称为网际网路蜘蛛(Internet Spider)或网络机器人(Web Robot)。爬虫的工作流程一般可以分为四步:确定初始网页地址(URL)、发送请求下载对应的网页、分析网页内容并提取需要的信息、提取页面中的链接作为新的网页地址(URL),然后继续循环执行上述流程,直到满足结束条件。
总结一句话就是:模拟浏览器打开网页,获取网页中我们想要的那部分数据。
二、爬虫需要了解的基础知识
爬虫的第一步就是确定初始网页地址(URL)、发送请求下载对应的网页,这一句话其实包含了好几个知识点。接下来我将拆分这个过程逐个讲解。
1、确定初始网页地址(URL)
URL 的全称为 Universal Resource Locator,即统一资源定位符,通常就是我们所说的网址。
例如:https://baike.baidu.com:443/item/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%B3%BB%E7%BB%9F/5937042?lang=zh-cn&keys=url
上面的例子我们可以拆分为几个部分:
①、协议:https或者http
②、域名:baike.baidu.com
③、端口:443
补充:https协议默认端口为443,http协议默认端口为80,浏览器会默认隐藏443和80端口显示,所以https://baike.baidu.com:443/和https://baike.baidu.com/在浏览器中效果一样
④、路径:由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址
/item/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%B3%BB%E7%BB%9F/5937042
补充:
"%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%B3%BB%E7%BB%9F"这一段其实是中文进过URL编码后的字符,有时候我们复制出的网页地址很长一段其实就是因为地址包含中文
可以用在线解码工具查看
⑤、参数:从"?"开始的部分为参数部分,又称搜索部分、查询部分
上述链接中的参数为?lang=zh-cn&keys=url包含两个参数。第一个参数名为lang,参数值为zh-cn,通常这个参数的意思通常是用于设置语言,即设置语言为中文。第二个参数通过"&"字符分隔,参数名为keys,参数值为url。
(两个参数为说明使用,该网站实际无这两个参数)
2、https/http协议
爬虫都是通过https或者http协议进行网络请求,第一部分的所有讲解都是为了学习http协议做铺垫。(https协议就是安全版本,小白目前不用考虑太多,可以当做http协议来学习)
http的全称是 Hyper Text Transfer Protocol,中文名叫做超文本传输协议,是一种简单、快速、无状态的传输协议。当客户端向服务器端发送请求时,只是简单的填写请求路径和请求方法即可。这里说的"无状态"是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传。客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。简单说明就是按http协议的方法打电话,相当于每次打给对方只能说一句话,然后等待对方会对方,对方回复玩完后又立马挂断。
由于这个特点,意味着客户端的每次请求都是独立的,与之前的请求或之后的请求无关,服务器不会在两个请求之间保留任何上下文信息。这样设计的好处是服务器不需要存储大量的信息来管理客户端的状态,这使得服务器更容易扩展,因为它不需要在多个请求之间同步状态。
注:本文中所有的客户端都当做浏览器即可
登录状态信息
然而,有时我们需要维护客户端状态,就要在每次请求报文中附加参数来管理登录状态,这时就需要用到一些机制来保存状态,比如:
①、Cookie:服务器可以在响应头中加入一个Cookie,客户端会存储这个Cookie,并在后续的请求中发送回服务器。服务器就可以通过读取Cookie的内容来识别客户端。(90%的网站都是将登录信息存储在这里)
可以在浏览器中按F12,找到应用/application中查看自己在所在网站的cookies
②、Token(如JWT):客户端请求时携带一个Token,服务器端验证Token来识别用户状态。
(部分网站会将token信息存储在Cookie中,这种情况和使用Cookie等同。也有部分网站将token单独放入请求头或者请求体中)
补充:删除Cookie或者Token就会导致网站的登录失效
http请求的形式
http是基于客户/服务器模式(C/S模式),面向连接的。一次完整的http请求流程如下:
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。
请求部分可以分为 3 部分内容:请求方法(Request Method)、请求头(Request Headers)、请求体(Request Body),http协议就是通过这些内容告知服务器我们需要什么数据。
目前爬虫的方式主要有两种,一种是通过接口调用爬取数据,这种方式就是直接发送请求。优点是速度快,效率高。缺点是部分网站有接口验证参数,不破解接口会被拦截掉。另外一种是通过selenium等通过浏览器模拟人工操作进行爬虫,优点是简单,用于爬取抖音视频这类交互型网站比较方便。缺点是效率相对较低,部分网站也有识别机制,会弹出验证码进行人机校验。
无论是上述哪种方法爬虫,都需要通过http的请求和响应爬取数据,所以掌握http的请求和响应是必备技能。下面我们通过一个案例讲解http的响应和请求。
首先打开一个网站的页面:
在浏览器中按F12打开开发者控制台,找到网络,勾选"保留日志"
然后在输入框中输入"爬虫"点击回车,下面会出现一片列表,这些都是浏览器发送的请求,和服务器回传数据的响应
找到v2开头的数据,点击它,右侧就会显示请求和响应的详情
详情页面首先会展示基础信息,比如请求方法,响应状态以及请求头和响应头。其中请求方法和响应状态比较重要。
请求方法种类:
方 法 | 描 述 |
GET | 请求页面,并返回页面内容 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 大多用于提交表单或上传文件,数据包含在请求体中 |
PUT | 从客户端向服务器传送的数据取代指定文档中的内容 |
DELETE | 请求服务器删除指定的页面 |
CONNECT | 把服务器当作跳板,让服务器代替客户端访问其他网页 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
我们通常只需要关注GET请求和POST请求即可,90%的请求都是使用这两种方式。两者最直观的区别就是 GET 把参数包含在 URL 中,在浏览器的地址栏可以直接看到请求的参数(就像第一部分讲的"?lang=zh-cn&keys=url"两个参数)。POST 通过请求体(request body) 传递参数,这部分请求不会包含在URL中,往往用于登录请求以及参数数据量大的请求(如上传文件)。
无论那种请求方式,我们都可以在开发者控制台中的载荷中查看请求参数。
因为这个接口用的是GET请求,所以我们在请求头的路径中可以查看到上面的所有参数
请求就是告诉服务器我们需要什么数据,而响应就是服务器返回给我们的数据,和请求一样,响应也分为响应头(response head)和响应体(response body)
点击"预览"或者"响应"标签就可以查看响应数据详情。
响应状态码简单归类:
1**:信息,服务器收到请求,需要请求者继续执行操作
2**:成功,操作被成功接收并处理
3**:重定向,需要进一步的操作以完成请求
4**:客户端错误,请求包含语法错误或无法完成请求
5**:服务器错误,服务器在处理请求的过程中发生了错误
常见的状态码:
200,请求成功(部分接口返回失败也是200状态,需要具体情况具体分析)
201,已创建,成功请求并创建了新的资源
202,已接受,已接受请求,但未处理完成
301,永久重定向,请求的资源被永久移到新URL,今后任何新的请求都应使用新的URL代替
302,暂时重定向,资源只是临时被移动,客户端仍使用原有的URL
400,客户端请求的语法错误,服务器无法理解
401,请求要求用户的身份认证
403,服务器理解客户端的请求,但是拒绝执行的请求
404,服务器无法根据客户端的请求找到资源
500,服务器内部错误,无法完成请求
501,服务器不支持请求的功能,无法完成请求
503,由于超载或系统维护,服务器暂时无法处理客户端的请求