本节将介绍网络爬虫的基础知识,数据采集是数据分析与处理的前提,该系列将简略介绍常用网络爬虫与web数据采集技术。
1.爬虫原理
理解问题往往比解决问题更重要,就如同把大象塞入冰箱,这个问题可以归纳为三个步骤:①把冰箱门打开;②把大象放入冰箱;③关上冰箱门,即完成了这一任务。同理,我们需要思考,网络数据的采集可以归纳为怎样的一个模型。

考虑人工采集一批网络数据,我们通常执行的步骤是:①打开目标网页(即含有目标数据的网页)。②浏览网页,定位需要的数据内容。③复制粘贴存储到本地,例如以表格、文本等形式存储。网络爬虫可以理解为是一种“脚本”,它的任务是模拟人工采集数据的过程,因此,爬虫原理就是通过脚本代码模拟以上的步骤。

从计算机层面来看人工采集数据的过程,实际上发生的事情是:①用户输入网址(URL),计算机向URL发送了请求request。②打开网页,网页服务器解析了请求,并返回响应response。③用户识别需要的数据,这一步是在定位数据,后续会介绍定位方法。④存储数据,人工可能是复制粘贴,爬虫部分可以存入数据库即可。综上,把人工采集数据转变为脚本代码即可。
2.请求和响应
网络爬虫中较为核心的是计算机网络的部分,即请求与响应的部分,这是获取到数据最重要的一环。需要了解的知识如下:
·HTTP/HTTPS协议:http协议是用于从网络传输超文本数据到本地浏览器的传输协议,https额外加入SSL层保障传输安全。
·Network面板:在浏览器的开发者工具中可在network面板了解网络请求记录,包括请求名称、响应状态码、请求类型、请求源、资源大小、总时间、时间瀑布流等信息。
·Request:客户端向服务端发出的请求,包含请求方式、请求连接、请求头、请求体四个部分。
·GET与POST请求方式:重点掌握GET与POST的请求方式,以便于模拟爬虫的请求。
·请求头:用来说明服务器要使用的附加信息,比较重要的信息有cookie、referer、user-agent等,在一些爬虫中需要额外添加请求头信息才能得到正确响应。
·请求体:一般承载的内容是POST请求中的Form Data,例如用户的账号密码,有多种数据提交方式。
·Response:服务端返回给客户端的响应,包括响应状态码、响应头、响应体。响应的正文数据都在响应体中,爬虫请求网页后最重要的工作就是解析响应体。
通过在浏览器中按F12可以打开浏览器调试工具,该面板中有两个内容相对来说比较重要,一个是“Elements”面板,这个包含了网页中各个你可看到的内容及组件的html代码(通过鼠标右键你需要的数据,再按“检查”也可以打开并定位)。另一个就是“Network”面板,这里面包含了网页中的各类请求和响应情况,以及一些动态的页面脚本,对于一些动态加载的数据,Network面板尤为重要。对于一个基本的爬虫代码编写来说,检查与定位目标数据比编写脚本代码更为重要。
3.理解网页结构
以b站为例,我们看到的网页通常来说是下图所示,这是面向人的一个展示维度,所以也称用户接口(User Interface),也就是我们常说的UI界面,这对于用户来说确实比较友好。我们可以右键查看源码,或者打开浏览器调试工具查看该网页的HTML源码长什么样。

结果就是下图这种一大堆乱七八糟的样子,这里的主体部分是一些HTML代码,由成对的尖括号及文本元素组成,此外还有一些CSS(层叠样式表)来控制样式,以及一些JavaScript的脚本实现交互。对于数据采集任务而言,最重要的部分当然是HTML部分,不难发现,我们需要的数据都在HTML部分中。因此我们需要了解HTML的结构

有了解过SGML、HTML、XML等知识的同学应该知道,HTML是典型的层次型数据结构,即一种树状结构。层次结构的典型例子之一就是电脑的磁盘文件,后续进行数据定位的时候可以使用xpath,不难发现xpath表达式和电脑中的文件路径很像,这都是一种通过父子节点路径关系去访问层次型数据结构中目标节点的方法之一。


上图就是将一段HTML代码转变为一个层次型数据结构的例子,包含节点、属性与文本节点。因此,对于网页中我们待采集的数据,拥有两种匹配思路:①将HTML当做非结构化的长字符串,将所需数据项匹配出来。②将HTML当做结构化的结点树,通过路径访问结点将所需数据项解析出来。这也对应了后续会介绍的regex方法与xpath、css_selector方法。
4.使用Network寻找更优的数据源
前面介绍了Network面板,这里顺带提一下具体怎么用,有些场景下,我们可以先试着使用Network面板查看是否需要采集的数据是否拥有捆绑了数据的api,如果能找到这些api,那么将极大提高抓取数据的效率。例如我们需要爬取b站的热门榜单,按F12呼出浏览器调试工具,然后找到Network面板,再选中其中的XHR,即XML Http Request,这时候按F5刷新面板。

然后我们就可以找到其中一个关于热门列表的请求,在请求头Headers中可以发现其请求的URL地址,我们输入进网页可以发现,该URL提供了结构化的数据源,方便我们直接采集数据,而不用在原网页通过一些定位技术获得数据元素。


5.仍需注意
网络数据采集极容易出现侵权和妨碍计算机安全的情况,因此,需要避免因滥用网络爬虫导致的各类危害及侵害。
后续将介绍网络爬虫的定位技术、request爬虫、selenium爬虫、scrapy爬虫等。