第九章 设计网络爬虫

网络爬虫介绍

基本算法

  1. 给定一组URL,下载对应的网页
  2. 从网页中提取URL
  3. 将新的URL添加到要下载的URL列表中,重复这三步

用途

  • 搜索引擎索引
  • 网络存档
  • 网络挖掘
  • 网络监测

优秀爬虫的特点

  • 可扩展性:高效使用并行化
  • 健壮性:能处理坏HTML、无响应服务器、崩溃、恶意链接等边缘情况
  • 礼貌性:短时间内不对同一个网站发出太多请求
  • 可扩展性:进行最小的更改即可支持新的内容类型

高级设计

总体流程

1752894112717

种子URL

种子URL是爬行爬取的起点,爬虫可以利用好的种子遍历尽可能多的链接。

  • 基于地理位置分类,不同国家流行网站不同
  • 根据主题选择

URL Frontier

爬取状态分为待下载状态和已下载状态,存储待下载状态的具有先进先出队列功能的组件称为URL Frontier。

HTML下载器

从互联网下载网页

DNS解析器

下载器在下载网页之前要调用DNS解析器将URL转换成相应的IP地址

内容解析器

下载网页后对内容进行解析验证,确保网页格式正确,避免浪费存储空间。将其作为一个单独的组件可以提高爬行服务器效率

内容查重器

有研究表明诸多网页是重复内容,内容查重器用于排除相同内容被多次存储的数据结构。使用逐个字符比较两个HTML文档速度慢且耗时,有效方法是直接比较两个网页哈希值。

内容存储

存储HTML内容的存储系统。

  • 大部分内容存储在磁盘上,因为数据集过大,无法存储在内容中

  • 流行内容保存在内存中,以减少延迟

URL提取器

从HTML页面中解析和提取链接

URL过滤器

排除某些内容类型、文件扩展名、错误链接和“黑名单”网站中的URL

URL查重器

用于跟踪在Frontier之前就已经访问过的URL的数据结构。有助于避免将相同的URL添加多次,这可能会增加服务器负载并且导致潜在的无限循环。常用技术为布隆过滤器和哈希表

URL存储

存储已访问的URL

构建组件和技术

广度优先搜索

作为网络爬虫的通用技术,通常使用先进先出队列实现。但是其存在问题:

  • 大多数来自同一网页的URL会链接回同一主机,简单BFS会让爬虫的请求充满一个主机,这被认为是不礼貌的,甚至可能会被当作拒绝服务(DOS)攻击
  • 标准的BFS没有考虑URL优先级,实际情况下需要根据页面排名、网络流量和更新频率来优先考虑URL

URL frontier组件是确保礼貌、URL优先级和新鲜度的重要组件。

礼貌

强行执行礼貌的思想是同一个主机中一次下载一页。同时在两个下载任务之间设置延迟。实际实现通过维护从网站主机名到下载线程的映射来实现,每个下载线程只下载对应的FIFO队列中的URL,并且将同一网站的URL维护在同一个队列中。

  • FIFO队列:每个队列包含来自同一主机的URL
  • 队列选择器:将每个工作线程映射到FIFO队列

参考资料有12

优先级

“优先排序器”能够根据PageRank、网站流量、更新频率等来衡量URL有用性。

  • 优先级排序器:URL输入并且计算对应的优先级
  • 队列:每个队列对应分配的优先级,优先级高的队列被选中概率高
  • 队列选择器:随机选择一个队列

最终形成管理优先级的前端队列和管理礼貌的后端队列

参考L. Page, S. Brin, R. Motwani, and T. Winograd, “The PageRank citationranking: Bringing order to the web,” Technical Report, StanfordUniversity,1998.

新鲜度

  • 基于网页的更新历史进行重新抓取
  • 优先处理重要页面的URL

前沿存储

URL数量过大,内存的存储不可持续不容易扩展,但是所有内容保存在磁盘会导致访问速度过慢。

采取混合方法,将大多数URL存储在大容量的磁盘上,同时在内存中维护缓冲区进行出队入队以减少磁盘读取和写入成本。将缓冲区中的数据定期写入磁盘。

HTML下载器

下载器会使用HTTP协议从互联网下载网页,同时也要遵循 Robots排除协议。

Robots.txt

Robots.txt又称为机器人排除协议,是网站与爬虫的通信标准,其指定了爬虫允许下载的页面,是爬虫在爬取网站前需要下载的文件。为了避免重复下载该文件,该文件会定期下载并保存到缓存中。

#从https://www.amazon.com/robots.txt 获取的robots.txt 文件中的一段
User-agent: Googlebot
Disallow: /creatorhub/*
Disallow:/rss/people/*/reviews
Disallow: /gp/pdp/rss/*/reviews
Disallow:/gp/cdp/member-reviews/
Disallow: /gp/aw/cr/

性能优化

  1. 分布式爬取:爬取任务根据URL空间划分被分布到多台服务器上,服务器运行多个线程进行爬取任务。
  2. 缓存DNS解析器:DNS解析任务受限于许多DNS接口的同步性质作为爬虫瓶颈,一个爬虫线程执行DNS请求的时候,其他线程将被堵塞,直到完成第一个请求。实现DNS缓存保存域名到IP地址的映射,并定期由cron作业更新是有效的速度优化技术
  3. 局部性:利用服务器相对于网站主机的地理优势获取速度提升,适用于绝大多数技术组件:爬虫服务器、缓存、队列、存储等
  4. 短超时:为避免web服务器响应缓慢或不响应带来的长时间等待,指定最大等待时间。未及时响应的页面将被爬虫跳过。

健壮性

  • 一致性散列:下载器之间的负载均衡,和添加删除下载服务器
  • 保存爬行状态和数据:防止故障导致的爬行中断,加载保存数据以快速重启服务
  • 异常处理:必须要优雅处理各种异常,防止系统崩溃
  • 数据验证:防止系统出错

可扩展性

这是每个系统都会发展的方向,本章系统的目标之一就是支持新的文件内容的灵活性

  • 插入PNG下载器模块来下载PNG文件
  • 插入网络监视器模块来监视网络中的版权和商标侵权

检测和避免问题

  1. 冗余内容:哈希 或 校验和
  2. 蜘蛛陷阱:蜘蛛陷阱是一个无限循环的网页。通过对URL设置最大长度和检测网站的网页数量可以避免部分陷阱,目前很难开发出自动算法来避免,更多依赖于用户手动
  3. 数据噪音:例如广告、代码片段、垃圾 URL 等内容没有价值,考虑将其排除在外

其余讨论点

  • 服务器端渲染:许多网站使用像JavaScript、AJAX等脚本来动态生成链接。直接下载和解析网页会遗漏动态生成的链接。为解决这个问题,需要额外添加执行服务器端渲染(也称为动态渲染)这一步骤,再解析页面
  • 过滤页面的精细化:添加类似于反垃圾邮件组件的过滤组件
  • 数据库复制和分片:提高数据层的可用性、可扩展性和可靠性
  • 横向扩展:保证大批量服务器执行下载任务的必要条件是服务器的无状态
  • 可用性、一致性和可靠性:大型系统成功的核心
  • 收集和分析数据

2025年7月19日补录昨日阅读文档

posted @ 2025-07-19 12:06  tanch25  阅读(18)  评论(0)    收藏  举报