Как узнать, когда веб-страница изменилась на V% в VB.net? - PullRequest
4 голосов
/ 27 июля 2011

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

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

Итак, теперь я думаю связать его с процентом «изменчивости».Что-то вроде: изменение на 5% приведет к запуску «измененной» логики.

Я хотел бы услышать любые идеи о том, как я могу достоверно сказать, когда страница изменилась значимым образом.1007 *

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Одним из решений является определение статических частей динамической страницы, которые вы считаете «измененными», если они обновляются. Использование инструмента diff (пример ниже) для сравнения исходного источника страницы с обновленным источником страницы. Однако определение этих частей вручную для каждого экземпляра страницы не обязательно будет хорошо масштабироваться, если у вас более нескольких десятков страниц.

Две идеи:

1) Используйте HTMLAgilityPack (.NET Library) для анализа DOM страницы и выполнения подсчета отдельных элементов страницы как для сохраненной, ранее отсканированной страницы, так и для недавно отсканированной ее версии. Используйте формулу, которую вы считаете удовлетворительной, чтобы отметить «изменение». Очень простой пример: старая копия имеет 8 якорей <a>, а новая - только 5.

2) Используйте разностную библиотеку DiffPlex http://diffplex.codeplex.com/ для определения изменений слов и строк. Через анализ вам нужно будет придумать базовую строку изменений для добавления слов и строк, которая вызовет действительное «изменение».

        var d = new Differ();
        var inlineBuilder = new InlineDiffBuilder(d);
        var result = inlineBuilder.BuildDiffModel(OldText, NewText);
        int inserted, deleted, modified = 0;
        foreach (var line in result.Lines)
        {

            if(line.Type == ChangeType.Inserted)
                inserted++;
            else if(line.Type == ChangeType.Deleted)
               deleted++;
            else if (line.Type == ChangeType.Modified)
                modified++;


        }
        // some base line formula/threshold you come up with through analysis
        if (deleted + inserted + modifed > 10)
           changed = true;
    }
0 голосов
/ 27 июля 2011

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

http://en.wikipedia.org/wiki/Levenshtein_distance

0 голосов
/ 27 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...