网络爬虫基本概念
基本概念
网络爬虫的 wiki 定义如下:
网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人,用来获取万维网上可用的数据。
对于爬虫本身是做什么的,我们都很熟悉,因此这个定义也不言自明。
基本类型
网络爬虫的经历了五个发展历程
-
建立索引
1989年互联网诞生之初没有搜索功能。
1993年6月产生了第一个万维网漫游器,可以抓取互联网上的所有网页,测量网页大小,同年12月首个基于爬虫的搜索引擎诞生 -
2000年网页API和API爬虫
Salesforce 和 eBay 首先推出自己的API供程序员下载数据使用
发送一组HTTP请求,然后接收JSON或XML的回馈,为开发人员提供了一种更友好的网络爬虫方式 -
2004 年Python Beautiful Soup
Beautiful Soup可以理解站点的结构,并帮助从HTML容器中解析内容。它被认为是用于网络爬虫的最复杂和最先进的库,也是当今常见和流行的方法之一。 -
网络抓取软件的可视化
为了降低网络爬虫的编码门槛,使更多有数据爬取需求的人能够使用网络爬虫,可视化的网络爬虫软件,它允许用户轻松简单的选择网页内容,并将这些数据构造成可用的excel文件或数据库。但是可视化软件的功能始终是有限的,当遇到高定制化、个性化的需求的时候,依然需要专门的爬虫工程师来完成。
网络爬虫的基本架构
基本架构
一个小型的网络爬虫,比如只爬取数个特定页面的爬虫,或许只要一个 py 文件就足以胜任,但是要爬取上百万页面的大型网络爬虫,就需要一定的架构才能更好的完成任务,这样的爬虫基本上框架如下:
- 爬虫调度端:来启动爬虫、停止爬虫、监视爬虫的运行情况
- URL管理器:对将要爬取的和已经爬取的URL进行管理
- 网页下载器:
- 从URL管理器中获取一个将要爬取的URL,传给网页下载器
- 下载器将URL指向的网页下载并存储为一个字符串
- 网页解析器:
- 将网页下载器下载下来的字符串进行解析
- 一方面获取价值数据,另一方面每个URL中往往还有指向其他页面的URL,需要补充到URL管理器中
这四个部分最终组成一个应用程序。
架构流程运行流程
整个爬虫的架构流程如下所示
- 调度器询问URL管理器是否有待爬取的URL?
- URL管理器返回是/否
- 如果是,调度器会从URL管理器中获取一个待爬取的URL
- URL管理器将URL返回给调度器
- 调度器将URL传给下载器对网页内容进行下载
- 下载好后下载器将URL内容返回给调度器
- 调度器将URL内容传递给解析器进行网页的解析
- 解析之后将价值数据和新的URL列表传给调度器
- 一方面调度器会将价值数据传递给应用进行数据的收集
- 另一方面将新的URL列表补充进URL管理器
- 如果URL管理器中还有未爬取的URL,那么将会一直执行上面的循环,直到爬取完所有URL
- 最后调度器会调用应用的方法将价值数据进行输出,将价值数据输出到需要的格式
各组件详解
URL管理器
- URL管理器用来管理待抓取URL集合和已抓取URL集合
- 防止重复抓取和循环抓取
- 因为每个网页都有很多指向其他网页的URL
- 其他网页也有指向本网页的URL,就可能存在URL循环指向的问题
- URL管理器需要支持的最小功能范围
- 添加新的URL到待爬取集合中
- 判断待添加的URL是否已经存在容器中
- 从容器中获取一个待爬取的URL
- 判断容器中还有没有待爬取的URL
- 将URL从待爬取集合移动到已爬取集合
URL管理器实现方式介绍:
- 将已爬取和未爬取的URL集合都存储在内存中:使用Python的set类型,因为Python的set类型可以自动去除集合中重复的数据元素
- 使用关系数据库:比如在MySQL中建立一张表
- 缓存数据库,比如使用redis,redis本身就支持set数据结构。目前大型的网络公司因为redis的性能比较高,一般都使用redis。
网页下载器
-
使用Python自带的urllib2模块或其他下载库
-
将互联网上URL对应的网页下载到本地的工具,因为将网页下载到本地才能进行后续的分析和处理
-
类似于网页浏览器,将URL对应的网页下载到本地存储为本地文件或者内存字符串,然后才能进行分析
-
urllib2模块:
- 支持直接的URL网页下载
- 或者向网页发送一些需要用户输入的数据
- 甚至支持需要登录网页的cookie处理、需要代理访问的代理处理
-
requests:第三方插件,功能更强大
网页解析器
可以使用正则表达式、html.parser、BeautifulSoup、lxml 等实现方式。
本人一般使用 xpath 的方式。