【问题标题】:Where to store web crawler data?在哪里存储网络爬虫数据?
【发布时间】:2012-01-17 01:00:13
【问题描述】:

我有一个简单的网络爬虫,它从根目录(给定 url)开始下载根页面的 html,然后扫描超链接并抓取它们。我目前将 html 页面存储在 SQL 数据库中。我目前面临两个问题:

  1. 似乎爬虫遇到了瓶颈,无法更快地爬虫,我在某处读到,对页面进行多线程 http 请求可以使爬虫爬得更快,但我不确定如何做到这一点。

  2. 第二个问题,我需要一个高效的数据结构来存储html页面并能够对其进行数据挖掘操​​作(目前使用SQL数据库想听听其他建议)

    李>

我正在使用 .Net 框架、C# 和 MS SQL

【问题讨论】:

    标签: c# algorithm web-crawler


    【解决方案1】:

    所以首先,我不会担心进入分布式爬虫和存储,因为顾名思义:它需要相当数量的机器才能获得好的结果。除非您拥有大量计算机,否则您将无法真正从中受益。你可以构建一个gets 300 pages per second and run it on a single computer with 150 Mbps connection的爬虫。

    列表中的下一件事是确定您的瓶颈在哪里。

    对您的系统进行基准测试

    尝试消除MS SQL:

    • 加载一个列表,例如 1000 个要抓取的 URL。
    • 对您抓取它们的速度进行基准测试。

    如果 1000 个 URL 无法为您提供足够大的抓取,则获取 10000 个 URL 或 100k 个 URL(或者如果您觉得勇敢,则获取 Alexa top 1 million)。在任何情况下,尝试建立一个排除尽可能多的变量的基线。

    识别瓶颈

    确定抓取速度的基准后,请尝试确定导致速度变慢的原因。此外,您将需要开始使用多线程处理,因为您受 i/o 限制,并且您在获取页面之间有很多空闲时间可以用来提取链接和做其他事情(例如工作)与数据库。

    您现在每秒获得多少页?您应该尝试每秒获取超过 10 页。

    提高速度

    显然,下一步是尽可能地调整你的爬虫:

    • 尝试加快爬虫速度,使其达到硬限制,例如带宽。
    • 我建议使用异步套接字,因为它们比阻塞套接字、WebRequest/HttpWebRequest 等快得多。
    • 使用更快的 HTML 解析库:从 HtmlAgilityPack 开始,如果您觉得勇敢,请尝试使用 Majestic12 HTML Parser
    • 使用 embedded database,而不是 SQL 数据库,并利用键/值存储(对键的 URL 进行哈希处理并将 HTML 和其他相关数据存储为值)。

    去专业!

    如果您已经掌握了以上所有内容,那么我建议您尝试成为职业选手!为了平衡新鲜度和覆盖率,您必须拥有一个模仿 PageRank 的良好选择算法:OPIC is pretty much the latest and greatest in that respect (AKA Adaptive Online Page Importance Computation)。如果你有上述工具,那么你应该能够实现 OPIC 并运行一个相当快的爬虫。

    如果你的编程语言比较灵活,又不想离C#太远,那么你可以试试Nutch等基于Java的企业级爬虫。 Nutch 与 Hadoop 和各种其他高度可扩展的解决方案集成。

    【讨论】:

    • @Lirik 最好用akka.net设计分布式爬虫和Redis来存储URL?
    • @virender 简短的回答是我没有使用过 Redis,我不确定。 benchmarking I've seen 表明 Redis 可能非常适合......尽管当您实现 AOPIC 并且您有大量页面时,您可能会遇到很多缓存未命中。在本地拥有一个嵌入式数据库并将“批量”计算推送到 Redis 可能会更好。我对 Akka.net 也不熟悉,所以很抱歉我不能在这里给你意见。
    【解决方案2】:

    这就是 Google 的 BigTable 的设计目的。 HBase 是一个流行的开源克隆,但您需要处理 Java 和(可能)Linux。 Cassandra 也是用 Java 编写的,但在 Windows 上运行。两者都允许 .NET 客户端。

    因为它们被设计为分布在多台机器上(存在数千个节点的实现),它们可以承受极其繁重的读/写负载,甚至比最快的 SQL Server 或 Oracle 硬件所能承受的负载还要大。

    如果您对 Java 基础架构不满意,您可能需要查看 Microsoft 的 Azure Table Storage,以了解类似的特征。不过,这是一个托管/云解决方案 - 您无法在自己的硬件上运行它。

    至于处理数据,如果您选择 HBase 或 Cassandra,则可以使用 Hadoop MapReduce。 MR 被 Google 推广用于您所描述的任务——处理大量网络数据。简而言之,这个想法是,MapReduce 不是在一个地方运行您的算法并通过它管道传输所有数据,而是将您的程序发送到存储数据的机器上运行。它允许您在基本上无限量的数据上运行算法,前提是您拥有相应的硬件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多