【问题标题】:How to crawl billions of pages? [closed]如何爬取数十亿页面? [关闭]
【发布时间】:2009-12-20 07:40:55
【问题描述】:

是否可以在单个服务器上抓取数十亿个页面?

【问题讨论】:

    标签: web-crawler


    【解决方案1】:

    如果您希望数据是最新的,则不需要。

    即使是搜索游戏中的一个小玩家,也会对数十亿次抓取的页面进行编号。

    “在 2006 年,Google 索引了超过 250 亿个网页、[32] 每天 4 亿次查询、[32] 13 亿张图片和超过 10 亿条 Usenet 消息。” - 维基百科

    请记住,这句话提到了 2006 年的数字。这是古老的历史。最先进的技术远不止于此。

    内容新鲜度:

    1. 新内容以非常大的速度不断添加(现实)
    2. 现有页面经常更改 - 您需要重新抓取有两个原因:a) 确定它是否已死,b) 确定内容是否已更改。

    爬虫的礼貌:

    1. 你不能压倒任何一个给定的站点。如果您从同一个 IP 反复访问任何主要站点,您很可能会触发验证码提示,否则他们会阻止您的 IP 地址。站点将根据带宽、请求频率、“坏”页面请求的数量以及各种其他因素来执行此操作。
    2. 有一个 robots.txt 协议,网站向爬虫公开,请遵守它。
    3. 有一个站点地图标准,站点向爬虫公开,使用它来帮助您探索 - 如果指定,您还可以(如果您选择)权衡站点上页面的相对重要性以及使用在缓存中的时间在站点地图中。

    减少你需要做的工作:

    1. 通常,网站会通过多个名称暴露自己 - 您需要检测相同的页面 - 这可能发生在相同的 url 或不同的 url 上。考虑页面内容的散列(减去带有不断变化的日期/时间的标题)。跟踪这些页面等效项并在下次跳过它们或确定给定站点之间是否存在众所周知的映射,这样您就不必抓取它们。
    2. 垃圾邮件。大量的人制作了大量的页面,这些页面只是传递给谷歌,但他们在整个网络上“播种”自己以让自己被抓取。

    所以 - 你总是在爬行的循环中。总是。你几乎肯定会在几台(很多很多)机器上。以确保您能够遵守礼貌,但仍能保持数据的新鲜度。

    如果您想按下快进按钮并使用您自己的独特算法处理页面....如果您需要快速使用预构建的爬虫,可以考虑使用“80 条腿”作为突出显示在Programmable Web。他们使用客户端计算能力来做到这一点。

    80 条腿正在使用来自孩子们在网站上玩游戏的机器循环。想一想网页上的一个后台进程,它在您使用该页面/站点时会调用并在您不知情的情况下运行,因为它们使用的是 Plura 技术堆栈。

    “Plura Processing 为分布式计算开发了一种新的创新技术。我们正在申请专利的技术可以嵌入到任何网页中。这些网页的访问者成为节点,并为在我们的分布式计算网络上运行的应用程序执行非常小的计算。” - Plura 演示页面

    因此,他们通过数千个 IP 上的数千个节点发出“爬网”,并对网站有礼貌,因此爬网速度很快。现在我个人不知道我是否喜欢使用最终用户浏览器的这种风格,除非在所有使用他们的技术的网站上都非常清楚地调用了这种风格 - 但如果没有别的,这是一种开箱即用的方法。

    在社区驱动的项目中编写了其他爬虫,您也可以使用它们。

    正如其他受访者所指出的那样 - 算一算。您需要每秒抓取约 2300 个页面才能跟上每 5 天抓取 1B 个页面的速度。如果你愿意等待更长的时间,这个数字就会下降。如果你认为你要爬超过 1B,这个数字就会上升。简单的数学运算。

    祝你好运!

    【讨论】:

    • 有必要提一下,目前的google索引是150亿,而企鹅更新后的2014年“真实”(带有大文本-不是购物页面)现在只有50亿左右。他们只是更好地了解到并非每个不同的 URI 都是不同的页面,现在可以更好地进行相似内容分析,而不是索引两次。
    【解决方案2】:

    大规模爬取(十亿页)是一个难题。以下是一些问题:

    • 网络带宽。假设每页是10Kb,那么你说的一共是 要获取 10 TB。

    • 网络延迟/慢速服务器/拥塞意味着您无法达到网络连接的理论带宽。对爬虫进行多线程处理只会有很大帮助。

    • 我假设您需要存储从数十亿页中提取的信息。

    • 您的 HTML 解析器需要处理以各种奇怪方式损坏的网页。

    • 为避免陷入循环,您需要检测到您“已经完成此页面”。

    • 页面发生变化,因此您需要重新访问它们。

    • 您需要处理“robots.txt”和其他管理(行为良好的)爬虫行为的约定。

    【讨论】:

      【解决方案3】:

      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 万个页面的抓取时间

      【讨论】:

      【解决方案4】:

      问题提出 5 年后,我可以回答是。

      而且我们的爬虫机已经不是很贵了,它可以在 EBay 上以大约 3000 欧元的价格买到,它包含 24x1TB 2,5" 磁盘(作为单磁盘运行)和两个 6 核 Intel Xeons(使其成为 12cores/24线程)和 96GB RAM,在卢森堡数据中心使用 10GBit Line(只有 33% 的百分位数)。

      它使用 100,000 个并发 HTTP 连接,每秒抓取大约 30,000 个页面。

      是的,今天的计算机速度非常快。顺便说一下,主要问题是 URL 处理和页面重复检测(同一页面可通过多种方式访问​​),而不是网络连接。

      【讨论】:

      • 有人问我关于 30,000 页/秒的问题,我们如何使用给定带宽做到这一点,我必须澄清这是完成的页面请求。包括我们设置的非常低的超时(慢速页面是不相关的,并且被蜘蛛访问的频率较低)。但最重要的是,我们只查看前 3kb(2 个 IP 帧)来确定这是否是重复的。大多数都是重复的,可以通过查看 HTML 标头轻松检测到
      • 如何检测只有 3kb 的欺骗页面?还有为什么有这么多重复页面,为什么这是一个大问题
      • 复制是最大的爬虫问题,因为到达页面的导航路径太多,而且大多数添加参数。但是您不能只是简单地删除查询参数。对于较大的网站,您可以尝试使用启发式算法和 ML 来自动检测哪些参数在您抓取之前不会更改上下文,我们就是这样做的。大多数页面(至少是我们感兴趣的页面 - 内容页面)现在支持足够的元数据,如链接规范或 og:url 数据来做出决定,并且您可以使用前 2 个 IP 包提取足够的
      • 这种欺骗检测当然只是第一道防线。你必须做很多聪明的事情来消除标题、侧边栏、嵌入式广告等中所有非内容装饰的影响。这就是一切变得有趣的地方。
      【解决方案5】:

      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 页。 如果您要在家庭网络上运行他们的爬虫,您可以期待以下性能:

      • @3.9 Mbps(美国居民的平均速度)/每页 22 kB = 每秒约 22 页:下载 10 亿页大约需要 526 天(约 1.5 年)。
      • @20 Mbps(家庭带宽上限)/22 kB/页 = ~116 pps:下载 10 亿页大约需要 100 天(约 3 个月)。

      【讨论】:

      • 这都是学术和理论,因为我们大多数人都没有那种带宽。非常有用的是如何微调 Unix 内核以利用 multi-curl,以及使用的最佳路由器类型。
      • @HenleyChiu 你提到大多数人没有带宽,那么你微调你的Unix内核或者你是否拥有最好的路由器并不重要。您的 Unix 内核很可能已经能够充分利用您拥有的最大带宽。如果您的带宽为 10 Mbps,而您的内核能够处理 50 Mbps,那么我看不出将其微调为能够以 200 Mbps 的速度处理会有多大帮助。
      • 如果你没有 100Mbps 的速度,你可以花 20 美元获得,甚至不要考虑爬网。顺便说一句,不要考虑使用 curl 来完成这项任务。 curl 将堆碎片化,很难运行它超过爬取大约 1 亿页。我试过了。
      【解决方案6】:

      hmm .. 如果你可以每秒“抓取”一页,你每天可以总共 86400 页(完成你的第 10 亿需要 11574.074 天,用它来根据你的每秒页面速度计算所需的时间).. 需要耐心。。 当然还有存储空间..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 2015-05-19
        • 2012-11-07
        • 2012-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多