2013-05-24 3 views
8

Я пытаюсь пропустить RSS-каналы, которые не были изменены с помощью feedparser и etags. Следуя рекомендациям документации: http://pythonhosted.org/feedparser/http-etag.htmlPython: Как проверить обновления RSS с помощью feedparser и etags

import feedparser 

d = feedparser.parse('http://www.wired.com/wiredscience/feed/') 
d2 = feedparser.parse('http://www.wired.com/wiredscience/feed/', etag=d.etag) 

print d2.status 

Это выходы:

200 

Не следует этот сценарий возвращающие 304? Я понимаю, что, когда RSS-канал обновляется, меняется этаг, и если они совпадают, то я должен получить 304.

Почему я не получаю ожидаемый результат?

+1

Невозможно воспроизвести его на моей машине. Я получаю '304', используя feedparser-5.1.3 на Python 2.6 – RedBaron

+0

Я также использую python 2.6 и feedparser-5.1.3, на Debian 6 – Marc

+0

Ah! Вероятно, прокси-сервер моей организации делает некоторое кэширование, и поэтому я не вижу проблемы. – RedBaron

ответ

16

Видимо, этот сервер настроен на проверку заголовка «If-Modified-Since». Вы также должны пройти последнее измененное время:

>>> d = feedparser.parse('http://www.wired.com/wiredscience/feed/') 
>>> feedparser.parse('http://www.wired.com/wiredscience/feed/', 
        etag=d.etag, modified=d.modified).status 
304 
>>> feedparser.parse('http://www.wired.com/wiredscience/feed/', 
        etag=d.etag).status 
200 
+0

Хорошо, что вы правильно говорите, что он работает с измененным заголовком. Но в этом случае вы можете полностью вынуть etag, и он вернет 304. Хотя это работает там довольно много каналов, которые имеют заголовки etag и не имеют модифицированных заголовков. Есть ли причина, почему Etags не работают? Может ли это быть связано с моим сервером, который делает запросы? – Marc

+2

Этиг и последние модифицированные заголовки - это две независимые технологии кэширования. Некоторые серверы используют один из них, некоторые из них могут использовать оба. Если вы хотите поддерживать кеширование для всех серверов, вы должны эмулировать стандартное поведение браузеров. Современные браузеры отправляют оба этига и if-modified-since с заголовками, поэтому вы должны сделать то же самое. –