2013-05-24 12 views
8

Sto provando a saltare i feed RSS che non sono stati modificati usando feedparser ed etags. Seguendo le linee guida della documentazione: http://pythonhosted.org/feedparser/http-etag.htmlPython: Come verificare gli aggiornamenti RSS con feedparser ed 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 

Emette:

200 

Non dovrebbe questo script restituire un 304? La mia comprensione è che quando il feed RSS viene aggiornato le modifiche etag e se corrispondono, allora dovrei ottenere un 304.

Come mai non sto ottenendo il mio risultato previsto?

+1

Impossibile riprodurlo sulla mia macchina. Ottengo un '304' usando feedparser-5.1.3 su Python 2.6 – RedBaron

+0

Sto anche usando python 2.6 e feedparser-5.1.3, su Debian 6 – Marc

+0

Ah! Probabilmente il proxy della mia organizzazione fa un po 'di cache e quindi non vedo il problema – RedBaron

risposta

16

Apparentemente questo server è configurato per controllare l'intestazione "If-Modified-Since". È necessario passare anche l'ora dell'ultima modifica:

>>> 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

Bene, hai ragione nel dire che funziona con l'intestazione Modified. Ma in questo caso puoi ritirare completamente l'etag e verrà restituito un 304. Anche se questo funziona ci sono un bel po 'di feed che hanno intestazioni etag e non hanno intestazioni modificate. C'è qualche motivo per cui gli Etags non funzionano? Potrebbe essere collegato al mio server che sta facendo le richieste? – Marc

+2

Etag e le intestazioni dell'ultima modifica sono due tecnologie di caching indipendenti. Alcuni server ne usano uno, alcuni potrebbero usare entrambi. Se si desidera supportare la memorizzazione nella cache di tutti i server, è necessario emulare il comportamento standard dei browser. I browser moderni inviano intestazioni sia etag che if-modified-since, quindi dovresti fare lo stesso. –

Problemi correlati