Как определить, являются ли две веб-страницы одинаковыми? - PullRequest
13 голосов
/ 19 января 2009

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

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

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

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

Ответы [ 13 ]

13 голосов
/ 19 января 2009

Звучит так, будто вы ищете надежный способ измерить сходство двух страниц.

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

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

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

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

5 голосов
/ 20 сентября 2012

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

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

Лучше всего прочитать Статья Хензингера 2006 года «Поиск почти дублированных веб-страниц: масштабная оценка алгоритмов»

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

5 голосов
/ 19 января 2009

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

2 голосов
/ 19 января 2009

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

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

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

2 голосов
/ 19 января 2009

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

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

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

1 голос
/ 19 января 2009

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

0 голосов
/ 02 сентября 2013

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

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

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

0 голосов
/ 19 января 2009

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

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

РЕДАКТИРОВАТЬ: Вы также можете сравнить src с img элементов.

0 голосов
/ 19 января 2009

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

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

Я закончил тем, что извлек элементы

и сравнил кэшированную копию с текущим слово в слово. Проще говоря:

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

После этого ряд сортировщиков будет работать над ним, игнорируя при этом общие слова «если, но может или и» при обработке других слов (ненормативной лексики и т. Д.) С большим весом.

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

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

0 голосов
/ 19 января 2009

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

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

HTML-документ можно преобразовать в XML-документ с красивым супом, а затем сравнить, используя методы, перечисленные там.

...