【问题标题】:How to know if the website being scraped has changed?如何知道被抓取的网站是否发生了变化?
【发布时间】:2011-02-01 14:01:01
【问题描述】:

我正在使用 PHP 来抓取网站并收集一些数据。这一切都在不使用正则表达式的情况下完成。我正在使用 php 的 explode() 方法来查找特定的 HTML 标签。

如果网站的结构发生变化(CSS、HTML),那么爬虫可能会收集到错误的数据。所以问题是——我怎么知道 HTML 结构是否发生了变化?如何在将任何数据存储到我的数据库之前识别这一点,以避免存储错误的数据。

【问题讨论】:

    标签: php screen-scraping web-scraping


    【解决方案1】:

    如果您要抓取内容发生变化的页面,我认为您没有任何干净的解决方案。

    我已经开发了几个 python 爬虫,我知道当网站只是对其布局进行细微的改变时会令人沮丧。

    您可以尝试一个机械化的解决方案(不知道对应的 php),如果幸运的话,您可以隔离您需要提取的内容(链接?)。

    另一种可能的方法是编写一些约束并在存储到数据库之前对其进行检查。

    例如,如果您正在抓取 Url,则需要验证抓取器解析的内容是否正式有效的 Url;整数 ID 或任何你想抓取的可以被识别为有效的东西都是一样的。

    如果你是抓取纯文本,检查起来会更困难。

    【讨论】:

    • 嘿,原来是我。对不起,不是故意的!!我按错了按钮,现在我无法更改它。它说-“投票太旧而无法更改,除非编辑此答案”。再次抱歉,请对答案进行一些更改,以便我投票。这不是故意的。
    【解决方案2】:

    取决于网站,但您可以计算抓取页面中的页面元素数量,例如 div、class 和样式标签,然后通过将这些总数与后来抓取的总数进行比较来检测页面结构是否已更改。

    可以对 CSS 文件使用类似的过程,其中可以使用简单的正则表达式提取每个类或 ID 的名称,并根据需要进行存储和检查。如果这个列表有新的添加,那么页面结构几乎肯定在被抓取网站的某个地方发生了变化。

    【讨论】:

      【解决方案3】:

      如果你想知道结构方面的变化,我认为最好的方法是存储你的第一个页面的 DOM 结构,然后与新的比较。

      有很多方法可以做到:- 萨克斯解析器 DOmParser 等

      我有一个小博客,可以说明我的意思 http://let-them-c.blogspot.com/2009/04/xml-as-objects-in-oops.html

      或者您可以使用http://en.wikipedia.org/wiki/Simple_API_for_XML 或 DOm Utility 解析器。

      【讨论】:

      • 在尝试将 XML 解析器与 HTML 结合使用时需要非常小心。他们往往会因为最轻微的格式错误的 HTML 而崩溃。
      【解决方案4】:

      在这里说实话,但您可能想看看一些文档对象模型 PHP 方法。

      http://php.net/manual/en/book.dom.php

      如果我对 DOM 非常非常有限的理解是正确的,那么 HTML 站点结构的更改会更改文档对象模型,但固定结构内的简单内容更改不会。那么,如果你能捕捉到 DOM 状态,然后在每次抓取时进行比较,理论上你就不能确定发生了这样的变化吗?

      (顺便说一句,当我在特定页面上发布律师考试结果时尝试收到电子邮件通知时,我这样做的方式只是比较 file_get_contents() 值。令人惊讶的是,工作完美无瑕:没有误报,并在网站发布内容后立即通过电子邮件发送给我。)

      【讨论】:

        【解决方案5】:

        首先,在某些情况下,您可能希望将原始 html 的 hashes 与新 html 进行比较。 MD5 和 SHA1 是两种流行的哈希。这可能在所有情况下都有效,也可能不有效,但您应该熟悉这一点。这将告诉您是否发生了某些变化 - 内容、标签或任何内容。

        要了解结构是否发生了变化,您需要捕获标签出现的直方图,然后进行比较。如果您关心标签乱序,那么您必须捕获标签树并进行比较以查看标签是否以相同的顺序出现。这将非常具体到您想要实现的目标。

        PHP Simple HTML DOM Parser 是一个可以帮助您解析 HTML 的工具。

        【讨论】:

        • @BrainLy:仅仅因为新的 html 文件具有不同的哈希值,并不意味着 HTML 结构发生了变化。
        • 哈希值会总是不同,因为我正在抓取的数据每小时都会发生变化!我的意思是,如果他们改变了网站的设计,如何才能有效地检测到呢?
        • 动态页面会始终如一地产生不同的哈希值,通常不会发生重大的结构变化。
        • 哈希不是一个有效的策略。
        • @systempuntoout 哈希值可能是有效的,这取决于这里的哈希值。正如 Brain Lyttle 所说,您可以对树的结构进行散列处理,看看它是否与当前结构的散列匹配。在这种情况下,它很可能是有效的。正如你所说,散列数据可能不是一个有效的策略。
        【解决方案6】:

        Explode() 不是 HTML 解析器,但您想了解 HTML 结构的变化。这会很棘手。尝试使用 HTML 解析器。没有其他方法能够正确地做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          • 2011-03-19
          • 2018-06-10
          • 2021-12-09
          • 1970-01-01
          • 2012-04-15
          • 1970-01-01
          相关资源
          最近更新 更多