【发布时间】:2009-12-20 07:40:55
【问题描述】:
是否可以在单个服务器上抓取数十亿个页面?
【问题讨论】:
标签: web-crawler
是否可以在单个服务器上抓取数十亿个页面?
【问题讨论】:
标签: web-crawler
如果您希望数据是最新的,则不需要。
即使是搜索游戏中的一个小玩家,也会对数十亿次抓取的页面进行编号。
“在 2006 年,Google 索引了超过 250 亿个网页、[32] 每天 4 亿次查询、[32] 13 亿张图片和超过 10 亿条 Usenet 消息。” - 维基百科
请记住,这句话提到了 2006 年的数字。这是古老的历史。最先进的技术远不止于此。
内容新鲜度:
爬虫的礼貌:
减少你需要做的工作:
所以 - 你总是在爬行的循环中。总是。你几乎肯定会在几台(很多很多)机器上。以确保您能够遵守礼貌,但仍能保持数据的新鲜度。
如果您想按下快进按钮并使用您自己的独特算法处理页面....如果您需要快速使用预构建的爬虫,可以考虑使用“80 条腿”作为突出显示在Programmable Web。他们使用客户端计算能力来做到这一点。
80 条腿正在使用来自孩子们在网站上玩游戏的机器循环。想一想网页上的一个后台进程,它在您使用该页面/站点时会调用并在您不知情的情况下运行,因为它们使用的是 Plura 技术堆栈。
“Plura Processing 为分布式计算开发了一种新的创新技术。我们正在申请专利的技术可以嵌入到任何网页中。这些网页的访问者成为节点,并为在我们的分布式计算网络上运行的应用程序执行非常小的计算。” - Plura 演示页面
因此,他们通过数千个 IP 上的数千个节点发出“爬网”,并对网站有礼貌,因此爬网速度很快。现在我个人不知道我是否喜欢使用最终用户浏览器的这种风格,除非在所有使用他们的技术的网站上都非常清楚地调用了这种风格 - 但如果没有别的,这是一种开箱即用的方法。
在社区驱动的项目中编写了其他爬虫,您也可以使用它们。
正如其他受访者所指出的那样 - 算一算。您需要每秒抓取约 2300 个页面才能跟上每 5 天抓取 1B 个页面的速度。如果你愿意等待更长的时间,这个数字就会下降。如果你认为你要爬超过 1B,这个数字就会上升。简单的数学运算。
祝你好运!
【讨论】:
大规模爬取(十亿页)是一个难题。以下是一些问题:
网络带宽。假设每页是10Kb,那么你说的一共是 要获取 10 TB。
网络延迟/慢速服务器/拥塞意味着您无法达到网络连接的理论带宽。对爬虫进行多线程处理只会有很大帮助。
我假设您需要存储从数十亿页中提取的信息。
您的 HTML 解析器需要处理以各种奇怪方式损坏的网页。
为避免陷入循环,您需要检测到您“已经完成此页面”。
页面发生变化,因此您需要重新访问它们。
您需要处理“robots.txt”和其他管理(行为良好的)爬虫行为的约定。
【讨论】:
Page 和 Brin (Google) 1998 年的原始论文描述了在 10 天内在 4 台机器上爬取 2500 万页。他们每台机器一次打开 300 个连接。我觉得这个还是很不错的。在我自己对运行 Linux 的现成机器进行的实验中,我可以可靠地同时打开 100-200 个连接。
在抓取时您需要做三件事:(1) 选择接下来要抓取的内容,(2) 获取这些页面,(3) 存储这些页面。对于 (1) 您需要实现某种优先级队列(即,进行广度优先搜索或 OPIC),您还需要跟踪您去过的地方。这可以使用布隆过滤器来完成。 Bloom 过滤器(在 Wikipedia 上查找)也可用于存储页面是否有 robots.txt 文件以及是否排除了给定 url 的前缀。
(2) 获取页面是固定成本,您对此无能为力;但是,在一台机器上,您受到打开连接数量的限制,如果您有电缆,您可能不会接近吃掉所有可用的带宽。不过,您可能不得不担心带宽上限。
(3) 存储页面通常在网络存档文件中完成,就像 Internet 存档所做的那样。通过压缩,您可能可以在 7 TB 中存储 10 亿页,因此在存储方面,拥有 10 亿页是可以承受的。作为对一台机器能做什么的估计,假设你得到一台便宜的 200 美元的机器,带有 1Gb 或 ram 和 160Gb 硬盘驱动器。在 20KB 页面(使用 Range 请求以避免吞下整个大页面)时,1000 万个页面将占用 200 GB,但压缩后约为 70 GB。
如果您保留搜索引擎运行的存档(您已经计算过页面排名和 bm25)以及活动的抓取存档,那么您已经消耗了 140 GB。这为您需要处理的其他随机内容留下了大约 20 GB 的空间。如果您计算出内存,您需要尝试在 RAM 中保留尽可能多的优先级队列和布隆过滤器,您也处于可能的边缘。如果您每天抓取 300,000 个页面,那么您将花费一个多月/1000 万个页面的抓取时间
【讨论】:
问题提出 5 年后,我可以回答是。
而且我们的爬虫机已经不是很贵了,它可以在 EBay 上以大约 3000 欧元的价格买到,它包含 24x1TB 2,5" 磁盘(作为单磁盘运行)和两个 6 核 Intel Xeons(使其成为 12cores/24线程)和 96GB RAM,在卢森堡数据中心使用 10GBit Line(只有 33% 的百分位数)。
它使用 100,000 个并发 HTTP 连接,每秒抓取大约 30,000 个页面。
是的,今天的计算机速度非常快。顺便说一下,主要问题是 URL 处理和页面重复检测(同一页面可通过多种方式访问),而不是网络连接。
【讨论】:
Texas A&M 的研究人员创建了 IRLbot,它具有高度可扩展性,能够在“短”时间内(约 7 天为 10 亿?)抓取数十亿网页,而资源很少(即 PC 数量) )。 Texas A&M 研究人员为其爬虫提供了以下统计数据:
我们提供了一套技术来处理这些问题和测试 他们在我们称为 IRLbot 的实现中的表现。在我们最近 历时 41 天的实验,IRLbot 在单台服务器上运行 成功爬取了 63 亿个有效 HTML 页面(76 亿 连接请求)并保持平均下载速率为 319 Mb/s(1,789 页/秒)。与我们之前的算法实验不同 相关工作中提出,这个版本的IRLbot没有体验 任何瓶颈并成功处理了超过 1.17 亿个内容 主机,解析出 3940 亿个链接,并发现了 具有 410 亿个唯一节点的网络图。
您可以在他们发表的论文中了解他们的爬虫的设计和架构, IRLbot: Scaling to 6 Billion Pages and Beyond,或者他们的full paper (very detailed)。
但是,抓取速度在很大程度上取决于您的带宽和您正在处理的数据量。因此,根据上述统计数据,我们可以看到 Texas A&M 的连接速度约为 319 Mbps(比美国家庭平均连接速度快约 100 倍),每页处理约 22 kB 的数据,每秒下载 1,789 页。 如果您要在家庭网络上运行他们的爬虫,您可以期待以下性能:
【讨论】:
hmm .. 如果你可以每秒“抓取”一页,你每天可以总共 86400 页(完成你的第 10 亿需要 11574.074 天,用它来根据你的每秒页面速度计算所需的时间).. 需要耐心。。 当然还有存储空间..
【讨论】: