ins @ngadc 前言 我相信很多人都听说过(网络)爬虫,但不清楚这到底是个什么概念。本文借助网上相关资料,进行简单地汇总整理。爬虫还是比较敏感,在简书发文章,竟然发不了。。。
目录 什么是网络爬虫
网络爬虫的基本原理
1、获取网页
2、提取信息
3、保存数据
4、自动化程序
能抓怎样的数据
网络爬虫种类
1、通用网络爬虫
2、聚焦网络爬虫
3、增量式网络爬虫
4、深层网络爬虫
小结
什么是网络爬虫 网络爬虫也叫网络机器人,可以代替人们自动化 浏览网络中的信息,进行数据的「采集」与「整理」。
它是一种程序 ,基本原理是向网站/网络发起请求,获取资源后分析并提取有用数据。
从技术层面来说,就是通过程序模拟浏览器请求站点的行为 ,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频)爬到本地,进而提取自己需要的数据,并存放起来使用。
我之前做的「极简新闻」就是用了网络爬虫,它每天定时帮我去各大新闻网站获取新闻标题。它很好地帮我省去了人为复制粘贴的流程。
网络爬虫离我们很近,比如说,你每天使用的百度,其实就是利用了这种爬虫技术:每天放出无数爬虫到各个网站,把他们的信息抓回来,然后化好淡妆排着小队等你来检索。简要流程如图1所示。
图1. 百度简要流程 网络爬虫的基本原理 下面介绍网络爬虫的基本原理,来自参考资料[2]。
我们可以把互联网比作一张大网,而爬虫(即网络爬虫)便是在网上爬行的蜘蛛。把网的节点比作一个个网页,爬虫爬到这就相当于访问了该页面,获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系,这样蜘蛛通过一个节点后,可以顺着节点连线继续爬行到达下一个节点,即通过一个网页继续获取后续的网页,这样整个网的节点便可以被蜘蛛全部爬行到,网站的数据就可以被抓取下来了。
下面简要介绍一下网络爬虫的基本流程:
1、获取网页 爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码 。源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息了。
前面讲了请求和响应的概念,向网站的服务器发送一个请求,返回的响应体便是网页源代码。所以,最关键的部分就是构造一个请求并发送给服务器,然后接收到响应并将其解析出来,那么这个流程怎样实现呢?总不能手工去截取网页源码吧?
不用担心,Python
提供了许多库来帮助我们实现这个操作,如urllib
、requests
等。我们可以用这些库来帮助我们实现 HTTP 请求操作,请求和响应都可以用类库提供的数据结构来表示,得到响应之后只需要解析数据结构中的Body
部分即可,即得到网页的源代码,这样我们可以用程序来实现获取网页的过程了。
2、提取信息 获取网页源代码后,接下来就是分析网页源代码,从中提取我们想要的数据。首先,最通用的方法便是采用正则表达式 提取,这是一个万能的方法,但是在构造正则表达式时比较复杂且容易出错。
另外,由于网页的结构有一定的规则 ,所以还有一些根据网页节点属性、CSS
选择器或XPath
来提取网页信息的库,如 Beautiful Soup
、pyquery
、lxml
等。使用这些库,我们可以高效快速地从中提取网页信息,如节点的属性、文本值等。
提取信息是爬虫非常重要的部分 ,它可以使杂乱的数据变得条理清晰,以便我们后续处理和分析数据。
3、保存数据 提取信息后,我们一般会将提取到的数据保存到某处以便后续使用。这里保存形式有多种多样,如可以简单保存为 TXT
文本或 JSON
文本,也可以保存到数据库,如 MySQL 和 MongoDB 等,也可保存至远程服务器,如借助 SFTP 进行操作等。
4、自动化程序 说到自动化程序,意思是说爬虫可以代替人来完成这些操作。首先,我们手工当然可以提取这些信息,但是当量特别大或者想快速获取大量数据的话,肯定还是要借助程序。爬虫就是代替我们来完成这份爬取工作的自动化程序,它可以在抓取过程中进行各种异常处理 、错误重试 等操作,确保爬取持续高效地运行。
能抓怎样的数据 在网页中我们能看到各种各样的信息,最常见的便是常规网页,它们对应着 HTML 代码,而最常抓取的便是 HTML 源代码。
另外,可能有些网页返回的不是 HTML 代码,而是一个 JSON 字符串(其中 API 接口大多采用这样的形式),这种格式的数据方便传输和解析,它们同样可以抓取,而且数据提取更加方便。
此外,我们还可以看到各种二进制数据,如图片、视频和音频等。利用爬虫,我们可以将这些二进制数据抓取下来,然后保存成对应的文件名。
另外,还可以看到各种扩展名的文件,如 CSS、Javascript 和配置文件等,这些其实也是最普通的文件,只要在浏览器里面可以访问到,就可以将其抓取下来。
上述内容其实都对应各自的 URL,是基于 HTTP 或 HTTPS 协议的,只要是这种数据,爬虫都可以抓取 。
Javascript 渲染页面 有时候,我们在用 urllib
或 requests
抓取网页时,得到的源代码实际和浏览器中看到的不一样。
这是一个非常常见的问题。现在网页越来越多地采用 Ajax 前端模块化工具来构建,整个网页可能都是由 Javascript 渲染出来的,也就是说原始的 HTML 代码就是一个空壳,例如:
This is a Demo
body 节点里面只有一个 id 为 container
的节点,但是需要注意在 body 节点后引入了 app.js
,它便负责整个网站的渲染。
在浏览器中打开这个页面时,首先会加载这个 HTML 内容,接着浏览器会发现其中引入了一个 app.js
文件,然后便会接着去请求这个文件,获取到该文件后,便会执行其中的 Javascript 代码,而 Javascript 则会改变 HTML 中的节点,向其添加内容,最后得到完整的页面。
但是在用 urllib
或 requests
等库请求当前页面时,我们得到的只是这个 HTML 代码,它不会帮助我们去继续加载这个 Javascript 文件,这样也就看不到浏览器中的内容了。
这也解释了为什么有时我们得到的源代码和浏览器中看到的不一样。
因此,使用基本 HTTP 请求库得到的源代码可能跟浏览器中的页面源代码不太一样。对于这样的情况,我们可以分析其后台 Ajax 接口,也可使用 Selenium
、Splash
这样的库来实现模拟 Javascript 渲染。
网络爬虫种类 下面介绍网络爬虫的四大种类,来自参考资料[1]。
1、通用网络爬虫 通用网络爬虫又叫作全网爬虫,顾名思义,爬取的目标资源在全互联网 中。这种爬虫所爬取的目标数据是巨大的,并且爬行的范围也是非常大的。
正是由于其爬取的数据是海量数据,所以对于这类爬虫来说,其爬取的性能要求是非常高的。这种网络爬虫主要应用于大型搜索引擎 中,有非常高的应用价值。
通用网络爬虫的策略主要有深度优先爬行策略 和广度优先爬行策略 。
2、聚焦网络爬虫 聚焦网络爬虫也叫主题网络爬虫,是按照预先定义好的主题有选择地进行网页爬取的一种爬虫。聚焦网络爬虫主要应用在对特定信息的爬取中,主要为某一类特定 的人群提供服务。
聚焦网络爬虫由于可以按对应的主题有目的地进行爬取 ,所以在实际的运用过程中可以节省大量的服务器资源和宽带资源,因而具有很强的实用性。这里我们以聚焦网络爬虫为例来了解爬虫运行的工作原理和流程。
图2. 聚焦网络爬虫流程 3、增量式网络爬虫 这里的「增量式」对应着增量式更新,增量式更新 指的是在更新的时候只更新改变的地方,而未改变的地方则不更新。
增量式网络爬虫,在爬取网页的时候,只爬取内容发生变化的网页或者新产生的网页,对于未发生内容变化的网页,则不会爬取。增量式网络爬虫在一定程度上能够保证所爬取的页面,尽可能是新页面 。
4、深层网络爬虫 在互联网中,网页按存在方式分类可分为「表层页面」和「深层页面」。
表层页面指的是不需要提交表单,使用静态的链接就能够到达的静态页面; 深层页面是需要提交一定的关键词之后才能够获取得到的页面。而在互联网中,深层页面的数量往往比表层页面的数量要多很多; 深层网络爬虫可以爬取互联网中的深层页面,爬取深层页面,需要想办法自动填写好对应表单。深层网络爬虫主要由URL列表、LVS列表(LVS指的是标签/数值集合,即填充表单的数据源)、爬行控制器、解析器、LVS控制器、表单分析器、表单处理器、响应分析器等部分构成。
小结 俗话说,爬虫玩得好,牢饭吃到饱 。当你比较熟练掌握网络爬虫时,限制你的不再是反爬虫技术,而是商业法律。
参考资料 [1] 通俗的讲,网络爬虫到底是什么?DataHunter回答
[2] Python3网络爬虫开发实战