2012-11-08 2 views
3

저는 프로그램을 마지막으로 실행 한 이후로 rss 업데이트를 가져와 표시 할 Python 프로그램을 작성하려고합니다. feedparser을 사용 중이며 etags를 사용하려고 시도했지만 마지막으로 here on SO으로 수정했지만 테스트 스크립트가 작동하지 않는 것으로 보입니다.Python etag/last modified not working; 최신 rss를 얻는 방법

import feedparser 
rsslist=["http://skottieyoung.tumblr.com/rss","http://mrjakeparker.com/feed/"] 
for feed in rsslist: 
print('--------'+feed+'-------') 
d=feedparser.parse(feed) 
print(len(d.entries)) 
if (len(d.entries) > 0): 
    etag=d.feed.get('etag','') 
    modified=d.get('modified',d.get('updated',d.entries[0].get('published','no modified,update or published fields present in rss'))) 

    d2=feedparser.parse(feed,modified) 
    if (len(d2.entries) > 0): 
     etag2=d2.feed.get('etag','') 
     modified2=d2.get('updated',d.entries[0].get('published','')) 

    if (d2==d): #ideally we would never see this bc etags/last modified would prevent unnecessarily downloading what we all ready have. 
     print("Arrg these are the same") 

나는 RSS/XML 기술은 I 온라인 사용하고 참조에서 변경된 경우 솔직히 잘 모르겠어요 또는 내 코드에 문제가있는 경우.

관계없이 RSS 피드를 효율적으로 사용하기위한 최상의 솔루션을 찾고 있습니다. 그것은 내가 마지막으로 수정 된 및 etags 필드의 사용에 의해 의도와 같은 대역폭 낭비를 최소화하기 위해 찾고 있어요. 사전에

감사합니다.

+0

문서의 정보는 다음의 제품에 말한다 나는 이전 요청의 최대 날짜보다 작은 날짜를 각 항목의 날짜를 확인하고 무시하도록 코드를 수정 것 'feed.etag'을 사용하십시오. 나는 그것이 정말로 중요하더라도 모르겠다. –

+0

@NathanVillaescusa 아니, 그건 중요하지 않아. 오류를 처리하는 방법으로 d.feed.get ('etag', '')을 사용하고 있습니다. 그것은 내가 사용하는 예제 중 어느 것도 etag를 반환하지 않기 때문에이 방법으로 수행합니다. –

+0

아, 그런 것 같아요. 목록의 첫 번째 URL에는 응답 헤더에 etag가없고 두 번째 URL에는 응답 헤더가 있습니다. –

답변

5

문제는 귀하가 etag 대신 최종 수정 날짜를 전달하고 있다는 것입니다. etagparse() 메서드의 두 번째 인수이고 modified은 세 번째 인수입니다.

대신에 :

d2=feedparser.parse(feed,modified) 

해야 할 것 :

d2=feedparser.parse(feed,modified=modified) 

소스 코드를 살펴 본다 후에는 parse() 기능에 etag 또는 modified을 통과하는 유일한 방법처럼 보인다 않는를 보낼 것입니다 서버가 아무런 변경이없는 경우 서버가 빈 응답을 반환 할 수 있도록 해당 헤더를 서버에 추가하십시오. 서버가 이것을 지원하지 않으면 서버는 전체 RSS 피드를 반환합니다.

import feedparser 
rsslist=["http://skottieyoung.tumblr.com/rss", "http://mrjakeparker.com/feed/"] 

def feed_modified_date(feed): 
    # this is the last-modified value in the response header 
    # do not confuse this with the time that is in each feed as the server 
    # may be using a different timezone for last-resposne headers than it 
    # uses for the publish date 

    modified = feed.get('modified') 
    if modified is not None: 
     return modified 

    return None 

def max_entry_date(feed): 
    entry_pub_dates = (e.get('published_parsed') for e in feed.entries) 
    entry_pub_dates = tuple(e for e in entry_pub_dates if e is not None) 

    if len(entry_pub_dates) > 0: 
     return max(entry_pub_dates)  

    return None 

def entries_with_dates_after(feed, date): 
    response = [] 

    for entry in feed.entries: 
     if entry.get('published_parsed') > date: 
      response.append(entry) 

    return response    

for feed_url in rsslist: 
    print('--------%s-------' % feed_url) 
    d = feedparser.parse(feed_url) 
    print('feed length %i' % len(d.entries)) 

    if len(d.entries) > 0: 
     etag = d.feed.get('etag', None) 
     modified = feed_modified_date(d) 
     print('modified at %s' % modified) 

     d2 = feedparser.parse(feed_url, etag=etag, modified=modified) 
     print('second feed length %i' % len(d2.entries)) 
     if len(d2.entries) > 0: 
      print("server does not support etags or there are new entries") 
      # perhaps the server does not support etags or last-modified 
      # filter entries ourself 

      prev_max_date = max_entry_date(d) 

      entries = entries_with_dates_after(d2, prev_max_date) 

      print('%i new entries' % len(entries)) 
     else: 
      print('there are no entries') 

이 생산 :

--------http://skottieyoung.tumblr.com/rss------- 
feed length 20 
modified at None 
second feed length 20 
server does not support etags or there are new entries 
0 new entries 
--------http://mrjakeparker.com/feed/------- 
feed length 10 
modified at Wed, 07 Nov 2012 19:27:48 GMT 
second feed length 0 
there are no entries 
+0

내 문제 설명에서 내가 분명하지 않다고 생각한다. 내 코드를 실행하면 etag을 되 찾을 수 없습니다. 따라서 수정 된 태그를 사용하여 두 번째 방법을 시도했습니다. 그러나 이것은 원하는 결과를 얻지 못하는 것 같습니다. [documentation] (http://packages.python.org/feedparser/http-etag.html)는 서버에서 이러한 태그를 가져 오지 못한다는 것을 보여줍니다. 나는 수정 된 부분이 rss의 일부라고 추측한다. [docs on etags] (http://packages.python.org/feedparser/reference-etag.html)는 etags가 http 헤더에 들어 있다고합니다. 그래서 나는 etag이 보내지지 않고있는 것 같아? –

+0

첫 번째 URL에 대한 서버가 etag을 전송하지 않고 두 번째 URL이 있습니다. 브라우저에서 URL을 열고 응답 헤더를 보면 확인할 수 있습니다. –

+0

내 답변을 업데이트했습니다. 시작해야한다고 생각합니다. –