LINUX.ORG.RU

Парсинг последних новостей

 


0

3

Хочу парсить с разных сайтов последние новости и составлять свою новостную страничку. Но хочу, чтобы отображались только те посты, которые ранее не отображались: как это сделать более элегантно, кроме сохранения содержимого в файл и постоянного сравнивания «если было, то…» ??? Если можете с примерами, то вообще хорошо.

Перемещено Zhbert из general


Ответ на: комментарий от D3306

как это сделать более элегантно, кроме сохранения содержимого в файл и постоянного сравнивания «если было, то…»

Храни хеши содержимого файла (сообщений) и сравнивай хеши того что ты парсишь с тем что у тебя есть. На это надо меньше места на жестком диске. Если тебе надо хранить содержимое, то возможно тоже есть смысл сравнивать хеши, чем искать по всему файлу, ну или обмазывайся СУБД, где всё за тебя посчитали и оптимизировали.

peregrine ★★★★★ ()

Это всё ещё не реально. Что бы кто не думал про достижения в области нейросетей и работы с текстами, вроде GPT-2, понять что текст про одно и тоже почти не возможно. А если это станет возможно, то этот софт можно будет монетизировать за астрономические деньги - проверка фактов и персональные достоверные новости с каждым годом всё более желанный продукт. Вот пример двух заголовков:

  1. Мужчина упал с балкона вслед за кричащей женщиной в Твери
  2. В Твери женщина вышла с балкона, а мужчина - следом за ней
system-root ★★★★★ ()
Ответ на: комментарий от peregrine

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

Но основная проблема - сам парсинг. Rss ТС не уважает, а открытым (бесплатным) api обладают всего несколько новостных сайтов.

А значит ТС будет совокупляться с html-парсингом,то есть гарантировано будет страдать и плакать.

whoisyou ()
Ответ на: комментарий от whoisyou

нет ничего плохого в html-парсинге. Проблема в другом: отделить нужный ТСу новостной контент от всего остального.

XoFfiCEr ★★★★ ()
Последнее исправление: XoFfiCEr (всего исправлений: 1)

кстати не встречал НИ ОДНОГО новостного сайта, который бы размещал новости в правильном хронологическом порядке. все они периодически публикуют новости задним числом (т.е. через какое-то время могут разместить новость, которая по времени пред-пред-идущая, хотя изначально её там не было). а пересмотрел я новостных сайтов несколько десятков самых известных. правда было это года 4 назад, как сейчас я не знаю.

teod0r ★★★★★ ()

Я не программист. Но когда я последний раз занимался подобным, то я получал список ссылок последних новостей с ресурса и искал в нем ссылку последней новости в моей локальной базе новостей. Если находил - добавлял все новости новее по списку и сохранял url самой новой новости для последующего применения. Если в списке свежих новостей не находилась ссылка на последнюю новость в моей базе данных, то запрашивал несколько новостей постарее и так до результата.

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

Leupold_cat ★★★★ ()
Последнее исправление: Leupold_cat (всего исправлений: 7)

ну если бы мне очень нужна была такая фича то решил бы так:

google alerts на почту уведомление об избранных новостях а потом тупо парсить то что гугл пришлет (и это будут самые актуальные новости). http://python-3.ru/page/imap-email-python

XoFfiCEr ★★★★ ()
Последнее исправление: XoFfiCEr (всего исправлений: 3)
Ответ на: комментарий от XoFfiCEr

1995 года еще

И? Тебе приходит по сути ХМЛ с текстом и прочими атрибутами, а дальше делать в три пинка можно. Или ты предлагаешь «стильно модно и молодежно» парсить хтмл целиком?

Zhbert ★★★★★ ()
Ответ на: комментарий от XoFfiCEr

rss давно пора закопать именно по причине смерти и того что он устарел морально.

Оно работает, работает как надо, и делает то, что нужно ТСу. Откуда такая навязчивая идея закапывать все «старое»? Ты еще музыку как днасек начни только новую слушать.

Zhbert ★★★★★ ()
Ответ на: комментарий от XoFfiCEr

Проблема в другом: отделить нужный ТСу новостной контент от всего остального.

В RSS такой проблемы нет. И парсить структурированный ХМЛ гораздо проще и быстрее, чем разбираться в дом-каше хтмл.

Zhbert ★★★★★ ()
Ответ на: комментарий от XoFfiCEr

во первых rss например у лажевого форума phpbb можно отключить.

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

Ты еще учти, что в случае с RSS тебе нужно только разбирать примерно одинаковые ХМЛ, а в случае с голым хтмл придется копаться в каше из дивов, причем для каждого сайта они будут разные. То есть для каждого сайта свой парсер, тогда как для RSS он будет один.

Zhbert ★★★★★ ()
Последнее исправление: Zhbert (всего исправлений: 1)
Ответ на: комментарий от Zhbert

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

anon1984 ()
Ответ на: комментарий от XoFfiCEr

Забавно, конечно, смотреть на вас, хипстеров. В то время когда одна половина штудирует научные труды и технологии 70ых и 80ых, вторая готова выкинуть всё, что создано до 2010-ых.

whoisyou ()
Последнее исправление: whoisyou (всего исправлений: 1)
Ответ на: комментарий от XoFfiCEr

нет ничего плохого в html-парсинге.

+1.

Проблема в другом: отделить нужный ТСу новостной контент от всего остального.

Надо просто научиться в Xpath. Очень хороший гайд есть, например, в MSDN. Но придется потратить время, чтобы сочинить выражения для каждого сайта.

Bagrov ★★★★★ ()
Ответ на: комментарий от Bagrov

Но придется потратить время, чтобы сочинить выражения для каждого сайта.

Пфф, задача «написать парсер» решается за 5-10 минут, при грамотно подобранном инструментарии.

А вот мониторинг актуальности парсера и оперативное решение проблем с ним - вот тут кроется истинная сложность задачи.

whoisyou ()
Ответ на: комментарий от Zhbert

Не спойлерите этим забавным господам. Через пять лет расскажем им про пуши и вебхуки (да, уже есть новостные сайты, которые готовы работать и так с Клиентами).

whoisyou ()
Последнее исправление: whoisyou (всего исправлений: 1)
Ответ на: комментарий от t184256

Для начала, я хочу получить ответ от господина, напиравшего на «моральное устаревание» RSS. Потому как по мне — атом или рсс это всего лишь малозначимые и неинтересные детали реализации.

ugoday ★★★★★ ()

Делал подобную задачу несколько лет назад. Реализовал таким образом:

  • Для получения новых статей (новостей) проверял RSS сайтов (но нет никаких проблем вместо этого смотреть sitemap.xml) и брал оттуда список адресов страниц за последние несколько дней
  • Реализовал шаблон проектирования «стратегия» с правилами парсинга для каждого сайта (стратегию по домену выбирал).
  • Статью сразу публиковать не стоит (т.к. бывают косяки) - нужно в админке сделать возможность отклонять статьи (занося их URL в чёрный список) перед публикацией.
  • Картинки надо скачивать к себе и в тексте статей подменять ссылки. Потому что если у тебя сайт с SSL, а ссылка на картинку http, то юзер в браузере будет видеть красный замок в адресной строке (ну или ещё как-то так будет отображаться ошибка SSL, не суть важно). Можно упростить задачу, если заюзать imgproxy, перед которым воткнуть Nginx, включив кеш картинок, но ссылки в текстах статей всё равно надо подменивать.

Алгоритм работы был следующим:

  • Раз в сутки читал RSS всех сайтов, которые надо парсить, и выбирал оттуда ссылки статьи за последние несколько дней.
  • Циклом проходил по полученному списку и проверял наличие адреса страницы в моей базе данных.
  • Если адреса нет в таблице БД, то запускал парсинг, по домену выбирая нужную стратегию. Из HTML вырезал ненужные теги, скачивал к себе картинки, а в тексте статьи менял ссылки на них на свои.
  • Сохранял статью в таблицу БД, не забыв сохранить адрес источника (в дальнейшем по нему определял, есть у меня такая статья или нет).

Сложность тут в том, что предусмотреть всё невозможно. HTML статей бывает кривым, более тогда иногда меняется. Иногда появляются новые блоки типа твиттер-виджета или рекламы - и из-за этого стратегии парсинга нужно регулярно обновлять, чтобы это всё корректно обрабатывать. Иногда в RSS попадает ссылка, которая редиректит хрен знает куда. То есть сделать и забыть тут не получится - придётся постоянно это дело поддерживать и допиливать. Также необходимо придумать способы обхода различных блокировок: разгадывать каптчу, юзать прокси и т.п.

dimuska139 ★★ ()
Последнее исправление: dimuska139 (всего исправлений: 2)
Ответ на: комментарий от XoFfiCEr

нет ничего плохого в html-парсинге

Ты эту задачу делал? Я - да. Геморрой полный парсить HTML. Одно дело распарсить один раз, другое - поддерживать это всё. Дизайн сайта поменяли - и лесом идёт твой парсер. И происходит это гораздо чаще, чем кажется.

dimuska139 ★★ ()