Как узнать, изменился ли веб-сайт?
Я использую PHP для очистки веб-сайта и сбора некоторых данных. Все это делается без использования regex. Я использую метод explode() php для поиска определенных тегов HTML.
возможно, что если структура сайта изменится (CSS, HTML), то Скребок может собрать неправильные данные. Итак, вопрос в том, как узнать, изменилась ли структура HTML? Как определить это перед хранением любых данных в моей базе данных, чтобы избежать неправильного хранения данных.
6 ответов
Я думаю, что у вас нет чистых решений, если вы очищаете страницу, где изменяется содержимое.
Я разработал несколько скребков python, и я знаю, как может быть неприятно, когда сайт просто вносит тонкие изменения в его макет.
вы можете попробовать решение a la mechanize (не знаете аналог php), и если Вам повезет, вы можете изолировать контент, который вам нужно извлечь (ссылки?).
другим возможным подходом было бы кодирование некоторых ограничений и проверьте их перед хранением в db.
например, если вы очищаете URL-адреса, вам нужно будет проверить, что то, что обработал скребок, является формально допустимым Url-адресом; то же самое для integer 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.
говоря из моей задницы здесь, но возможно, вы захотите взглянуть на некоторые методы PHP объектной модели документа.
http://php.net/manual/en/book.dom.php
Если мое очень, очень ограниченное понимание DOM правильно, изменение структуры сайта HTML изменит объектную модель документа, но простое изменение содержимого в фиксированной структуре не будет. Итак, если вы можете захватить состояние DOM, а затем сравнить его при каждой царапине, не могли бы вы теория определяет, что такое изменение было сделано?
(кстати, то, как я это сделал, когда я пытался получить уведомление по электронной почте, когда результаты экзамена были опубликованы на определенной странице, было просто сравнить file_get_contents() значения. Удивительно, но работал безупречно: никаких ложных срабатываний, и отправил мне по электронной почте, как только сайт разместил контент.)
зависит от сайта, но вы можете подсчитать количество элементов страницы на выскобленной странице, таких как теги div, class & style, а затем, сравнивая эти итоги с результатами более поздних царапин, определить, была ли изменена структура страницы.
аналогичный процесс может использоваться для файла CSS, где имена каждого класса или id могут быть извлечены с помощью простого регулярного выражения, сохранены и проверены по мере необходимости. Если этот список имеет новые дополнения, то структура страницы почти наверняка изменилась где-то на участке скребут.
во-первых, в некоторых случаях вы можете сравнить хэши из оригинала в новый html. MD5 и SHA1-два популярных хэша. Это может быть или не быть действительным во всех обстоятельствах, но это то, с чем вы должны быть знакомы. Это скажет вам, если что - то изменилось-контент, теги или что-то еще.
чтобы понять, изменилась ли структура, вам нужно будет захватить гистограмму вхождений тегов, а затем сравнить их. Если вы заботитесь о тегах быть тогда вам нужно будет захватить дерево тегов и сделать сравнение, чтобы увидеть, происходят ли теги в том же порядке. Это будет очень специфично для того, чего вы хотите достичь.
PHP простой парсер HTML DOM - это инструмент, который поможет вам разобрать HTML-код.
Explode()
не является синтаксическим анализатором HTML, но вы хотите знать об изменениях в структуре HTML. Это будет непросто. Попробуйте использовать синтаксический анализатор HTML. Ничто другое не сможет сделать это правильно.