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

  • Автор темы Автор темы Automator
  • Дата начала Дата начала

Automator

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

В который раз надеюсь, что будет более развёрнутый ответ, чтобы было на что опереться, но увы...:(

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

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

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

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

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

Парсится именно ссылка, а не заголовок для сравнения, потому что ссылка, по идее, всегда будет валидна, а заголовки иногда выдают косяки + разные посты могут иметь одинаковые заголовки, но разные ссылки (ветки форума)
 
Последнее редактирование:
  • Оценить
Реакции: Automator
@zennomoves Спасибо за ответ, вы описали алгоритм, под который, скорее всего, подпадает подавляющие большинство ситуаций. Но все же, если предположить, что исходная страница не содержит ссылок, а сама по себе является источником контента, такое может быть в случае, например, с каким-нибудь расписанием...
 
А контент на странице повторяется или постоянно уникален? Например, добавляется новая информация, но часть старой еще не исчезла со страницы?

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

А так вам действительно без кода страницы сложно что-то советовать будет.
 
Иногда может помочь удаление дублей.
 
А контент на странице повторяется или постоянно уникален? Например, добавляется новая информация, но часть старой еще не исчезла со страницы?

Контент новый добавляется, старый частично убирается и процесс постоянный.
Пока придумал так: парсить и складывать нужный контент в таблицу. А потом при помощи спипета на 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")
Как улучшить регулярку?
ЗЫ. Простите за перфекционизм)
 
Может я, конечно чего-то не понимаю, но вам лучше использовать
(?<=<a\ href=").*(?=\#comments")

Из вашего примера возвращает 1 значение
/razdel/posttitle-id
 
Последнее редактирование:
Может я, конечно чего-то не понимаю, но вам лучше использовать
(?<=<a\ href=").*(?=\#comments")

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

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