如何知道被刮的网站是否已经改变?

时间:2010-03-27 17:52:13

标签: php screen-scraping web-scraping

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

如果网站的结构发生变化(CSS,HTML),则刮刀可能会收集错误的数据。所以问题是 - 我如何知道HTML结构是否已经改变?如何在将任何数据存储到我的数据库之前识别它,以避免存储错误的数据。

6 个答案:

答案 0 :(得分:7)

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

我已经开发了几个python scraper,我知道当网站对其布局进行微妙的改变时,会有多么令人沮丧。

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

另一种可能的方法是编写一些约束并在存储到db之前检查它们。

例如,如果您要抓取Url,则需要验证刮刀已解析的内容是否正式为有效的Url;对于整数ID或您想要刮去的任何内容都可以被识别为有效。

如果要抓取纯文本,则检查起来会更加困难。

答案 1 :(得分:2)

如果您想了解结构方面的变化,我认为最好的方法是存储第一页的DOM结构,然后将其与新结构进行比较。

有很多方法可以做到: - SAXParser的 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解析器。

答案 2 :(得分:2)

在这里说出我的屁股,但可能你可能想看一些文档对象模型PHP方法。

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

如果我对DOM的理解非常非常有限,那么HTML网站结构的变化会改变文档对象模型,但固定结构中的简单内容更改则不会。那么,如果你能捕获DOM状态,然后在每次刮擦时进行比较,理论上你不能确定已经做出了这样的改变吗?

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

首先,在某些情况下,您可能希望将原始版本的hashes与新版html进行比较。 MD5和SHA1是两个流行的哈希。这在所有情况下可能有效,也可能无效,但您应该熟悉。这将告诉您某些内容是否已更改 - 内容,标签或任何内容。

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

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

答案 5 :(得分:0)

Explode()不是HTML解析器,但您想了解HTML结构中的更改。这将是棘手的。尝试使用HTML解析器。没有其他任何东西能够做到这一点。