【问题标题】:Not crawling the same content twice不会两次抓取相同的内容
【发布时间】:2009-11-08 12:03:49
【问题描述】:

我正在构建一个小型应用程序,它将抓取内容不断增长的网站(例如在 stackoverflow 上),不同之处在于内容一旦创建就很少被修改。

现在,在第一遍中,我抓取了网站中的所有页面。

但接下来,该站点的分页内容 - 我不想重新抓取所有内容,只是最新添加的内容。

因此,如果该站点有 500 个页面,那么在第二遍时,如果该站点有 501 个页面,那么我只会抓取第一页和第二页。这是处理这种情况的好方法吗?

最后,爬取的内容最终会出现在 lucene 中——创建一个自定义搜索引擎。

所以,我想避免多次抓取相同的内容。有更好的主意吗?

编辑:

假设该站点有一个页面:将像这样访问的结果:

Results?page=1 , Results?page=2 ...等

我想跟踪上次抓取时有多少页面并仅抓取差异就足够了。 (也许使用页面上每个结果的哈希值 - 如果我开始遇到相同的哈希值 - 我应该停止)

【问题讨论】:

  • 我不确定问题是什么,真的。
  • 如果您假设内容永远不会被修改,您希望新的可抓取链接如何出现?
  • 除了Thomas所说的,这种方法没有考虑到插入后内容可能会发生变化。保持它在这里,想想有很多答案的问题,其中澄清来自对原始问题的修改......
  • 正如我在编辑中提到的,我的意思是一旦添加了“结果”,它就不会改变。当我说页面时,我的意思更多是对某些结果进行分页。一旦添加东西,总页数会发生变化,但一个结果的内容通常不会改变。

标签: web-crawler


【解决方案1】:

如果每条内容都位于唯一的位置,只需将这些位置(可能是 URL)输入哈希字段并在“抓取”内容之前检查它。无论如何,该 URL 可能应该是您在 Lucene 中存储的数据的一部分,因此这应该很容易通过在添加到索引之前进行搜索来完成。

【讨论】:

  • 该死,你是对的,我刚刚意识到页面上的每个结果都必须有一个唯一的 url。谢谢:)
【解决方案2】:

我的方法是存储看到的每个页面内容的哈希/指纹。这样,当您重新获取页面时,您将验证指纹,如果它匹配,则没有任何更改并且不需要解析,因为您已经处理了页面及其上的所有链接。

【讨论】:

  • 但实际上获取页面可能比解析它并将其添加到索引中要慢。你需要获取它来散列它。
  • 这就是冲突..除非您获取它(或询问服务器是否更改了),否则您真的不知道它是否更改了.. OP 如何知道页数已更改?知道页面名称与知道它的内容是不一样的。至少我知道该页面类似于 SO,页面确实会发生变化。
【解决方案3】:

网站是否为每个被提取的资源发布有效的电子标签?如果是这样,您可以发出已知资源的条件 GET,并且在服务器发送资源(即它已更改)的情况下,您可以寻找新的链接来抓取、更新内容等。

当然,这仅在您的网站发布电子标签并响应条件获取时才有效...

【讨论】:

    【解决方案4】:
    1. 对网站进行标准的全站爬网以获取所有历史内容
    2. 跟踪他们的 RSS 提要以查找新内容
    3. 定期重复站点范围的抓取以获取更新的内容

    【讨论】:

      【解决方案5】:

      查看“Last-Modified”HTTP 标头。在 C# 中,来自 HttpWebResponse,如果它不等于 DateTime.Now,则内容已更改。因此,您可以使用本地内容(假设您正在存储它)来为您的爬虫提供信息。

      因此,当您抓取时,请存储网页内容和“Last-Modified”标头。

      此外,您可以存储每个唯一的 AbsoluteUri,该方法运行良好,直到 AbsoluteUri 的查找时间超过获取页面所需的时间,或者您可以使用 Bloom 过滤器:http://en.wikipedia.org/wiki/Bloom_filter

      除了弄清楚 Google 站点地图(或 RSS 提要)在哪里之外,您不会知道新内容添加到哪里。自动知道就像窃贼问你新购买的东西在哪里而不先问你。 :)

      【讨论】:

        猜你喜欢
        • 2019-02-20
        • 1970-01-01
        • 2022-01-22
        • 2012-03-31
        • 2017-03-22
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        相关资源
        最近更新 更多