Как определить, совпадают ли две веб-страницы?

Какие методы хороши для определения того, является ли веб-страница такой же, как другая?

То же самое, я не имею в виду char -for- char эквивалент (это просто), но достаточно прост, чтобы игнорировать что-то вроде текущей даты/времени на странице и т.д.

Например, перейдите к Yahoo! В новостной статье загрузите страницу, откройте одну и ту же страницу через 10 минут в другом браузере. Сбрасывая перезаписи, эти страницы будут иметь некоторые отличия (отметки времени, возможно, такие вещи, как реклама, возможно, такие вещи, как связанные истории), но человек может посмотреть на них и сказать, что они одинаковы.

Примечание. Я не пытаюсь исправить (или полагаться) на нормализацию URL. I.e., выясняя, что foo.html и foo.html? Bar = bang - то же самое.

Ответ 1

Похоже, вы после надежного способа измерения сходства двух страниц.

Учитывая, что структура страницы не изменится так сильно, мы можем уменьшить проблему до проверки того, является ли текст на странице примерно одинаковым. Конечно, при таком подходе проблемы, упомянутые nickf относительно страницы фотографов, все еще существуют, но если вы в основном относитесь к Yahoo! новости или тому подобное, все должно быть в порядке.

Для сравнения со страницами вы можете использовать метод из машинного обучения под названием "ядер строк". Здесь ранний paper недавний набор слайды в пакете R и видео лекция.

Очень грубо говоря, строковое ядро ​​ищет, сколько слов, пар слов, тройки слов и т.д. имеют два документа. Если A и B являются двумя документами, а k - ядром строки, то чем выше значение k (A, B), тем более похожи эти два документа.

Если вы установите пороговое значение t и только говорите, что два документа одинаковы для k (A, B) > t, у вас должен быть достаточно хороший способ делать то, что вы хотите. Конечно, вам нужно будет настроить порог, чтобы получить наилучшие результаты для вашего приложения.

Ответ 2

Вы можете обнаружить, что две страницы одинаковы, используя некоторую метрику подобия, такую ​​как сходство с косинусом. Затем вам нужно будет определить минимальный порог, который вы можете использовать, чтобы принять, одинаковы ли оба документа. Например, я бы выбрал значение, самое близкое к 1 при применении меры косинуса, поскольку оно колеблется от -1 для совершенно разных и 1 для идентичных.

Ответ 3

Для этой проблемы я нахожу поиск в академических статьях намного лучше, чем задавать StackOverflow, имея дело со спецификой, эксперты часто намного умнее, чем толпа.

У каждого веб-браузера или поисковой системы есть эта проблема и решил. Вероятно, существует хороший подход с использованием метода, основанного на ядре как предлагается принятым ответом, но вы, вероятно, захотите начать с более простых методов, которые, как известно, хорошо работают. После этого вы можете перейти к методам ядра и проверить, улучшают ли они ваши результаты.

Лучше всего читать Документ Henzinger 2006 "Поиск почти дублированных веб-страниц: масштабная оценка алгоритмов"

и вы, вероятно, будете пытаться генерировать отпечаток Rabin в качестве первого шага с 'Фингерпринтинг случайными полиномами' Рабин 1986.

Ответ 4

Я использую vgrep для такого рода материалов.

Это малоизвестный инструмент под названием visual-grep, который опирается на передовые технологии, такие как оптическое окулярное устройство и визуальную кору, для очень быстрого определения одинаковости страниц бок о бок, и он замечательно точный и эффективный (он должен быть поскольку он разрабатывался довольно долгое время).

Маркировка сообщества wiki в случае, если юмористическая полиция находится сегодня: -).

Ответ 5

В зависимости от того, что вы делаете, вас может заинтересовать TemplateMaker. Вы даете ему несколько строк (например, веб-страницы), и они отмечают биты, которые меняются.

В вашем Yahoo! Например, вы можете получить страницу один раз и сообщить TemplateMaker об этом. Затем вы получите его снова и скажите, чтобы узнать, что он.

Когда вы были счастливы, что ваш TemplateMaker знал, что было одинаковым каждый раз, вы могли бы получить другую страницу и спросить TemplateMaker, соответствует ли она шаблону другим. (Это даст вам части, которые изменились, если вас это заинтересовало.)

Ответ 6

Вы можете использовать компонент веб-браузера для рендеринга скриншота двух страниц, а затем сравнить изображения. Возможно, это самый простой вариант.

Ответ 7

Без интимного знания структуры страниц, которые вы пытаетесь сравнить, это может быть очень сложно. То есть, как машина должна сказать, что страница с несколькими разными картинками одинакова - если это новостной сайт с рекламой, тогда он должен быть тем же, но если это портфолио фотографа, то это определенно отличается.

Если вы знаете структуру страницы, то, что я делаю, это вручную выбрать части страницы (используя идентификаторы, селектора CSS, XPath и т.д.) для сравнения. Например, сравните div #content между обновлениями страницы. Оттуда вам может потребоваться добавить уровень допуска в сравнение char -by- char.

Там есть служба, которая на самом деле делает подобное. Он назвал Rsspect (написанный Райаном Севером славы Qwantz), который обнаружит изменения на любом веб-сайте и создаст RSS-канал из него, даже если вы не контролируете страницу.

Ответ 8

Вы можете создать хеш MD5 каждого из них, а затем сравнить это. Как вы сказали, достаточно легко.

То, что вы ищете, - это метод сравнения двух страниц с произвольными элементами, которые могут измениться. Это тяжелая проблема.

  • Определите области на странице, которые могут измениться, и вам все равно. Осторожный! Они всегда будут двигаться.
  • Хеш или сделайте контрольную сумму DOM только тех частей страницы, о которых вы заботитесь. Осторожный! Они также всегда будут меняться.

Вы против первого правила скрипирования экрана: страница по своей сути нестабильна. Так что это сложная проблема. Ваше решение будет NEVEr достаточно надежным, чтобы учитывать бесконечное разнообразие тонких изменений, на которые будут влиять исходные данные, если вы также не имеете прямого контроля над исходными страницами и можете разработать свое решение против этого.

Удачи! У меня был опыт работы с системами, которые пытались решить эту проблему, и это действительно крутой гайка для взлома.

Ответ 9

Способ сделать это - не сравнивать всю страницу, потому что, как вы говорите, человек тоже не обманут. Скажите, что вас интересуют новостные статьи Yahoo! страницы, поэтому вы должны посмотреть только на раздел новостей. Затем вы можете делать что угодно, хеш или буквальное сравнение между новой и старой версиями.

Ответ 10

Первая мысль, которая пришла мне в голову, заключалась в том, чтобы обрабатывать страницы в XML-документах с помощью BeautifulSoup (Python), запускать diff на них и подсчитывать количество строк. Если count > X%, они разные. Не очень надежный и, вероятно, склонный к ошибке, но это был бы быстрый взлом, который я сделал бы для тестирования.

Возможно, вам стоит взглянуть на эту страницу, на которой обсуждается сравнение двух XML-документов:
  http://www.ibm.com/developerworks/xml/library/x-diff/index.html

Документ html можно принудительно внедрить в XML-документ с красивым супом, а затем сравнить с помощью перечисленных там методов.

Ответ 11

У меня была аналогичная проблема. Я пытался создать безопасную систему ссылок для каталога ссылок, отправленных пользователем. Пользователь опубликовал бы страницу на блоге или новостном сайте и передал бы ссылку на индекс. Человек будет проверять правильность ссылки, а затем добавить страницу в индекс.

Проблема заключалась в том, чтобы придумать способ автоматизации проверок, которые гарантировали, что связь со временем будет соответствовать. Например, кто-то изменил страницу через несколько недель и ввел расовые оскорбления? Разве новостной сайт начал рассказывать людям "вы должны подписаться, чтобы прочитать эту историю"?

Я закончил извлечение абзаца <p> элементов и сравнение кешированной копии с текущим словом. Проще говоря:

cached[] = { "Lorem", "Ipsum", "..." };
scanned[] = { "Lorem, "foo", ... };

После этого серия сортировщиков будет работать на нем, игнорируя общие слова "если, но может и/или", обрабатывая другие слова (ненормативную лексику и т.д.) с более тяжелым весом.

Это привело к системе подсчета очков, которая полностью игнорировала бы незначительные изменения и ревизии (опечатки, структуру предложений и т.д.), но быстро обнаруживала, нужно ли снова проверять содержимое. Затем был получен счет, баллы выше порога были помещены в очередь для повторного подтверждения человеком.

Это также помогло объяснить основные косметические изменения на сайте. Я бы не верил, что он побежит сам по себе, но он сделал свою работу предсказуемо хорошо с небольшой помощью от людей. По общему признанию, система была не такой эффективной, как это могло бы быть в той мере, в какой идет методология.

Ответ 12

Вы можете попробовать использовать HTTP-заголовки, такие как If-Modified-Since, или некоторые другие заголовки, связанные с кешем. Кроме того, может быть полезно посмотреть файл карты сайта, чтобы узнать, как часто ожидаются проверки в поисковых системах.

Моя другая попытка (возможно, будет использоваться в сочетании) заключалась бы в составлении списка всех id и class es, найденных в div на странице. Если эти списки не совпадают, вероятно, произошли разумно заметные изменения. В противном случае они, вероятно, очень похожи.

EDIT: вы также можете сравнить src элементов img.

Ответ 13

Недавно я столкнулся с этой проблемой и работал над решением для JavaScript здесь: https://github.com/kennychua/pdiffy/

Он позволяет сравнивать изображения страницы (желательно формат PNG без потерь), и он скажет вам, разные ли изображения, и если да, то это будет подчеркивать различия.

Он также имеет возможность игнорировать такие области, как проблема с меткой времени, которую вы описываете