我正在使用 PHP 来抓取网站并收集一些数据。这一切都在不使用正则表达式的情况下完成。我正在使用 php 的 explode() 方法来查找特定的 HTML 标记。
如果网站的结构发生变化(CSS、HTML),那么爬虫可能会收集到错误的数据。所以问题是——我怎么知道 HTML 结构是否发生了变化?如何在将任何数据存储到我的数据库之前识别这一点,以避免存储错误的数据。
我正在使用 PHP 来抓取网站并收集一些数据。这一切都在不使用正则表达式的情况下完成。我正在使用 php 的 explode() 方法来查找特定的 HTML 标记。
如果网站的结构发生变化(CSS、HTML),那么爬虫可能会收集到错误的数据。所以问题是——我怎么知道 HTML 结构是否发生了变化?如何在将任何数据存储到我的数据库之前识别这一点,以避免存储错误的数据。
如果您正在抓取内容更改的页面,我认为您没有任何干净的解决方案。
我已经开发了几个 python 爬虫,我知道当网站只是对其布局进行细微的改变时会令人沮丧。
您可以尝试使用 la mechanize 的解决方案(不知道对应的 php),如果幸运的话,您可以隔离需要提取的内容(链接?)。
另一种可能的方法是编写一些约束并在存储到数据库之前检查它们。
例如,如果您正在抓取 Url,则需要验证 scraper 解析的内容是否正式有效的 Url;整数 ID 或任何你想抓取的可以被识别为有效的东西都是一样的。
如果您正在抓取纯文本,则检查起来会更加困难。
取决于站点,但您可以计算抓取页面中的页面元素数量,例如 div、类和样式标签,然后通过将这些总数与后来抓取的总数进行比较,检测页面结构是否已更改。
可以对 CSS 文件使用类似的过程,其中可以使用简单的正则表达式提取每个类或 id 的名称,并根据需要进行存储和检查。如果这个列表有新的添加,那么页面结构几乎肯定在被抓取的网站的某个地方发生了变化。
如果您想了解结构方面的变化,我认为最好的方法是存储第一页的 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 解析器。
在这里说出来我的屁股,但您可能想看看一些文档对象模型 PHP 方法。
http://php.net/manual/en/book.dom.php
如果我对 DOM 的非常非常有限的理解是正确的,那么 HTML 站点结构的更改会更改文档对象模型,但固定结构内的简单内容更改不会。所以,如果你能捕获 DOM 状态,然后在每次抓取时进行比较,你在理论上就不能确定已经进行了这样的更改吗?
(顺便说一句,当我在特定页面上发布律师考试结果时试图收到电子邮件通知时,我这样做的方式只是比较 file_get_contents() 值。令人惊讶的是,工作完美无缺:没有误报,并通过电子邮件发送给我网站一发布内容。)
首先,在某些情况下,您可能希望将原始 html 的哈希值与新 html 的哈希值进行比较。MD5 和 SHA1 是两种流行的哈希。这可能在所有情况下都有效,也可能不有效,但您应该熟悉这一点。这将告诉您是否发生了某些变化 - 内容、标签或任何内容。
要了解结构是否发生了变化,您需要捕获标签出现的直方图,然后进行比较。如果您关心标签乱序,那么您必须捕获标签树并进行比较以查看标签是否以相同的顺序出现。这将非常具体到您想要实现的目标。
PHP Simple HTML DOM Parser是一个帮助您解析 HTML 的工具。
Explode()
不是 HTML 解析器,但您想了解 HTML 结构的变化。这会很棘手。尝试使用 HTML 解析器。没有其他东西能够正确地做到这一点。