Проверка RSS-каналов на наличие нового контента с помощью feedparser

Я использую python для создания приложения, которое работает аналогично агрегатору RSS. Для этого я использую библиотеку feedparser. Однако я изо всех сил пытаюсь заставить программу правильно определять, есть ли новый контент.

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

Атрибут «id» Feedparser, связанный с каждым элементом, кажется просто ссылкой на статью, поэтому это может помочь в обнаружении новых статей в ленте, но не в обнаружении обновлений к предыдущим статьям, поскольку «id» для них не изменится.

Я просмотрел предыдущие потоки по stackoverflow, и некоторые люди предлагали хешировать контент или хешировать заголовок + URL, но я не совсем уверен, что это означает или как это сделать (если это действительно правильный подход).


person user1106610    schedule 19.12.2011    source источник


Ответы (1)


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

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

Так например.

>>> import hashlib
>>> url = "http://www.example.com/article/001"
>>> title = "The Article's Title"
>>> id = hashlib.md5(url + title).hexdigest()
>>> print id
785cbba05a2929a9f76a06d834140439
>>> 

Это предоставит идентификатор, который изменится, если URL или заголовок изменится, указывая, что это новая статья.

Вы можете загрузить и добавить содержимое статьи в хеш, если вы также хотите обнаружить изменения в содержании статьи.

Обратите внимание: если вы намерены перетащить целые страницы вниз, вы можете узнать о HTTP conditional GET with Python, чтобы сэкономить полосу пропускания и быть немного более дружелюбным к посещаемым сайтам.

person David K. Hess    schedule 19.12.2011
comment
Отлично. Спасибо за это. Проблема, с которой я столкнулся сейчас, заключается в том, что я получаю разные хеш-значения каждый раз, когда читаю один и тот же контент. Я получаю такое содержимое: content = urllib.urlopen(items[0]["link"]).read(), а затем вычисляю хеш-значение. Если я прочитаю один и тот же контент во второй раз, используя вышеизложенное, на этот раз я получу другое хеш-значение, чего не должно происходить, поскольку контент должен быть таким же. Есть какие-нибудь подсказки о том, как я могу это предотвратить? - person user1106610; 20.12.2011
comment
Вероятно, существует ряд причин, по которым полная веб-страница может изменяться от одной загрузки к другой. Например, на боковой панели может быть список новых статей, который регулярно обновляется. Все сводится к определению содержания. Вам нужно углубиться в HTML-код страницы, найти тело самого сообщения и использовать его в качестве своего содержимого. - person David K. Hess; 20.12.2011