2010-03-27 66 views
5

我使用PHP来刮取网站并收集一些数据。这一切都没有使用正则表达式。我使用php的explode()方法来查找特定的HTML标签。如何知道被抓取的网站是否发生了变化?

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

回答

7

我认为,如果您在内容发生变化的页面上进行拼写,您没有任何清晰的解决方案。

我已经开发了几个python刮刀,我知道如果网站只是对其布局进行微妙的改变,怎么会令人沮丧。

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

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

例如,如果您正在抓取Url,则需要验证哪些scraper已解析为正式的Url;相同的整数ID或任何你想刮,可以被认为是有效的。

如果您正在刮纯文本,将会更难以检查。

+0

嘿,那就是我。对不起,因为它不是故意的!我按了错误的按钮,现在我无法改变它。它说 - “投票太旧,无法更改,除非这个答案被编辑”。再次抱歉,请对答案进行一些更改,以便我可以对其进行投票。这不是故意的。 – Yeti 2010-03-27 18:59:32

1

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

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

PHP Simple HTML DOM Parser是一个工具,它可以帮助你解析HTML。

+2

@BrainLy:只是因为新的HTML文件有不同的散列,并不意味着HTML结构已经改变。 – codaddict 2010-03-27 18:01:33

+0

哈希将*总是*不同,因为我刮的数据每小时变化!我的意思是,如果他们改变了网站的设计,那么如何以有效的方式检测到呢? – Yeti 2010-03-27 18:03:49

+0

动态页面会始终产生不同的散列,通常不会发生重大结构更改。 – 2010-03-27 18:04:02

0

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

+0

任何关心解释他们downvote? – spender 2010-03-27 18:08:40

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工具解析器。

+1

尝试使用HTML解析器时,您需要非常小心。他们倾向于在最微小的格式错误的HTML上炸掉。 – 2010-03-27 18:18:30

2

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

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

如果我非常,非常有限的DOM的理解是正确的,在HTML网站结构的变化将改变文档对象模型,而是一个固定的结构中一个简单的内容变化不会。那么,如果你能捕捉到DOM状态,然后在每次刮擦中比较它,你理论上是不是可以确定这种改变已经发生? (顺便说一下,当我在一个特定的页面上发布条形考试结果时,我试图获得电子邮件通知时,我这样做的方式就是比较file_get_contents()值。令人惊讶的是,没有误报:没有误报,并在网站发布内容后立即通过电子邮件发送给我。)

2

取决于网站,但您可以计算刮样页面中页面元素的数量,如div,&样式标记,然后通过比较这些总数与稍后的刮擦检测页面结构是否已经改变。

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

相关问题