设计网络爬虫

网络爬虫 Web Crawler,也称为机器人或蜘蛛,被搜索引擎广泛地用于发现网络上的新内容或者更新的内容。这些内容可以是网页、图片、 视频、PDF 文件等。爬虫从收集网页开始,然后顺着这些网页上的链接收集新的内容。

爬虫有很多用途,搜索引擎索引、网页存档、网络挖掘、网络监控。

可以是一个小的学校项目几小时可以完整,也可以是一个需要专业团队持续优化的巨型项目。

图9-1

理解问题

爬虫的基本算法很简单:

  1. 给定一组URL,下载这些URL对应的所有网页
  2. 从这些网页中提取URL
  3. 将新的URL添加到需要下载的URL列表中,然后重复执行这3个步骤

需要并行化来高效爬取信息,健壮性 网络上充满陷阱 糟糕HTML内容 无响应服务器 恶意链接很常见, 爬虫需应对这些极端情况。礼貌性,不应该很短时间间隔对同一个网站发送太多请求。

封底估算

高层级设计

爬虫工作流程:

图9-4

DFS 与 BFS

可以把网络想成一个有向图,其中网页就是节点,超链接URL是边,爬虫在网络上爬行的过程可以看作是从一个网页到其他网页的有向图遍历。常见的两种图遍历算法 是 DFS 和 BFS 。 但是,因为 DFS 的深度可能非常深,所以它通常不是一个好的选择 。

BFS 是爬虫常用方法,通过先进先出队列实现,在一个FIFO队列中,URL按照它们入列的顺序出列。有两个常见问题需要注意:

URL 前线

礼貌性,确保礼貌性的大致思路是,从同一个主机每次只下载一个网页。可以在两次下载任务之间加入一定的延时 。 礼貌性约束是通过维护网站主机名和下 载线程 ( Worker) 的 映射来实现的。每个下载线程都有独立的FIFO 队列且只下载这个队列里的 URL 。

图9-6

每个主机映射到一个队列,每个队列只包含来自同一个主机的URL。在每个队列上加延时出队。

优先级排序器 ( Prioritizer) 是处理 URL 优先级排序 的组件。入队前进行一些分析与处理:

图9-7

新鲜度:

由千互联网上不断有网页被添加、删除和修改,所以爬虫必须定期重新爬取下载过的 网页,以确保数据是最新的。重新爬取所有的 URL 是非常消耗时间和资源的。下面是两个 优化新鲜度的策略。

URL前线的存储,URL前线中的URL数量可能非常多,放在硬盘才是理想方案。 采用混合方案,将大部分URL存储在硬盘上,为了降低读写开销,在内存中维护缓冲区以进行入队和出队 操作,缓冲区中数据定期写入硬盘。

HTML 下载器

机器人排除协议 Robots Exclusion Protocol robots.txt

例如 https:// www. amazon.com/robots. txt 其中规定了如 creatorhub 之类的目录是不允许谷歌机器人爬取的。

User-agent: *
Disallow: /exec/obidos/account-access-login
Disallow: /exec/obidos/change-style
Disallow: /exec/obidos/flex-sign-in
Disallow: /exec/obidos/handle-buy-box
Disallow: /exec/obidos/tg/cm/member/
Allow: /gp/offer-listing/B000
Allow: /gp/offer-listing/9000
Disallow: /gp/aag
User-agent: ClaudeBot
Disallow: /

分布式爬取,爬取任务被分配给多个服务器,每个服务器多个线程。

缓存DNS解析器,维护 DNS 缓存 , 避免频繁 向 DNS 服务器发起请求,是一个提高爬虫爬行速度的有效技术。

本地性,将爬虫服务器按地理位置分布。爬虫服务器离网站主机越近,爬虫的下载速度会越快。本地性设计可以应用到大部分系统组件上 : 爬虫服务器、缓存、队列、存储等。

短超时时间,一些Web服务器响应慢或根本不响应,为避免长时间等待应设置超时时间。

健壮性

用一致性哈希使HTML下载器均匀分布。

保存爬取状态和数据,应对故障将爬取状态和数据写入存储系统。

异常处理,错误是无法避免的,爬虫必须能得体地处理异常。

数据校验,是防止系统错误的重要措施。

可扩展性

设计 爬虫可以通过插入新的模块来进行扩展,

搞成流水线,每个步骤可以介入。

检测和避免有问题的内容