Защита от повторов

Automator

Client
Регистрация
14.02.2016
Сообщения
12
Благодарностей
1
Баллы
3
Хочу сделать парсер страницы которая регулярно обновляется.
Как избежать повторного парсинга данных которые были собраны в предыдущие проходы?
Интересует просто оптимальный алгоритм, но если будут какие-то снипеты или готовые проекты на схожие темы, то тоже будет интересно взглянуть.
 

zennomoves

Client
Регистрация
05.12.2011
Сообщения
235
Благодарностей
72
Баллы
28
Контент какого типа парсится?
 

Automator

Client
Регистрация
14.02.2016
Сообщения
12
Благодарностей
1
Баллы
3

zennomoves

Client
Регистрация
05.12.2011
Сообщения
235
Благодарностей
72
Баллы
28
Преимущественно текстовой. Возможно, иногда текст с картинками.
В который раз надеюсь, что будет более развёрнутый ответ, чтобы было на что опереться, но увы...:(

То, что ты сказал не очень помогает. Интересовала структура, к которой можно привязаться. Что ж Вы так все на слова-то скупитесь?

Ладно, буду пальцем в небо тыкать. :-)

Предположу, что у тебя стандартная структура: заголовки + всё остальное под ними, и что тебе нужно спарсить эти заголовки и связанный с ними контент.

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

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

Парсится именно ссылка, а не заголовок для сравнения, потому что ссылка, по идее, всегда будет валидна, а заголовки иногда выдают косяки + разные посты могут иметь одинаковые заголовки, но разные ссылки (ветки форума)
 
Последнее редактирование:
  • Спасибо
Реакции: Automator

Automator

Client
Регистрация
14.02.2016
Сообщения
12
Благодарностей
1
Баллы
3
@zennomoves Спасибо за ответ, вы описали алгоритм, под который, скорее всего, подпадает подавляющие большинство ситуаций. Но все же, если предположить, что исходная страница не содержит ссылок, а сама по себе является источником контента, такое может быть в случае, например, с каким-нибудь расписанием...
 

kopc

Client
Регистрация
24.11.2011
Сообщения
146
Благодарностей
56
Баллы
28
А контент на странице повторяется или постоянно уникален? Например, добавляется новая информация, но часть старой еще не исчезла со страницы?

Не подойдет?
1. Парсить код страницы.
2. выбирать информацию регуляркуй с поиском по div и классу css, например
3. Сохранять самую верхнюю позицию в переменную
4. при обновлении страницы собирать значения со всей и начинать пасрсинг только новых позиций пропустив все позиции ниже значения из прошлой переменной.

А так вам действительно без кода страницы сложно что-то советовать будет.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Иногда может помочь удаление дублей.
 

Automator

Client
Регистрация
14.02.2016
Сообщения
12
Благодарностей
1
Баллы
3
А контент на странице повторяется или постоянно уникален? Например, добавляется новая информация, но часть старой еще не исчезла со страницы?
Контент новый добавляется, старый частично убирается и процесс постоянный.
Пока придумал так: парсить и складывать нужный контент в таблицу. А потом при помощи спипета на C# сравнивать с уже спарсенными данными

Кстати, раз уж тут про речь зашла регулярные выражения. Спрошу может кто ответит:
При парсинге уролв с целевой страницы также парсятся урлы на комментарии в тех страницах где уже есть комметы. Получаются тоже дубли. Урлы выглядит так:
domen.ru/razel/post-id
domen.ru/razel/post-id#comments
Как регуляркой брать прямой урл и исключить тот что с #comments на конце ссылки.
Я сделал так, вроде работает, но я в них плохо разбираюсь, возможно есть более грамотное написание.
Код:
Пример кода ссылок:
<a href="/razdel/posttitle-id">
<a href="/razdel/posttitle-id#comments" title="Перейти к первому комментарию.">1 комментарий</a></li>title="Перейти к первому комментарию.">1 комментарий</a></li>

Регулярка:
(?<=")/razdel/.*?(?="|#comments")
Как улучшить регулярку?
ЗЫ. Простите за перфекционизм)
 

kopc

Client
Регистрация
24.11.2011
Сообщения
146
Благодарностей
56
Баллы
28
Может я, конечно чего-то не понимаю, но вам лучше использовать
(?<=<a\ href=").*(?=\#comments")

Из вашего примера возвращает 1 значение
/razdel/posttitle-id
 
Последнее редактирование:

Automator

Client
Регистрация
14.02.2016
Сообщения
12
Благодарностей
1
Баллы
3
Может я, конечно чего-то не понимаю, но вам лучше использовать
(?<=<a\ href=").*(?=\#comments")

Из вашего примера возвращает 1 значение
/razdel/posttitle-id
Дело в том, что комменты есть не у всех постов. И в таком виде берется прямой урл, но только от тех постов где есть комменты.
Моя регулярка как раз работает так как мне нужно, просто, хотелось увидеть альтернативные способы написания, но с тем же результатом.
 

budora

Client
Регистрация
13.08.2012
Сообщения
831
Благодарностей
554
Баллы
93
domen.ru/razel/post-id А использовать привязку post-id и потом использовать либо базу постов, либо последний пост ... тут варианты в каком виде post-id
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)