2013-03-04 14 views
7

私のpythonアプリケーションでは、データを収集するために多くのWebページを読み込む必要があります。 http呼び出しを減らすには、変更されたページだけを取得したいと思う。私の問題は、私のコードは常にページが変更されたことを私に伝えています(コード200)が、実際はそうではありません。ウェブページが変更されたかどうかを検出します

これは私のコードです:

from models import mytab 
import re 
import urllib2 
from wsgiref.handlers import format_date_time 
from datetime import datetime 
from time import mktime 

def url_change(): 
    urls = mytab.objects.all() 
    # this is some urls: 
    # http://www.venere.com/it/pensioni/venezia/pensione-palazzo-guardi/#reviews 
    # http://www.zoover.it/italia/sardegna/cala-gonone/san-francisco/hotel 
    # http://www.orbitz.com/hotel/Italy/Venice/Palazzo_Guardi.h161844/#reviews 
    # http://it.hotels.com/ho292636/casa-del-miele-susegana-italia/ 
    # http://www.expedia.it/Venezia-Hotel-Palazzo-Guardi.h1040663.Hotel-Information#reviews 
    # ... 

    for url in urls: 
     request = urllib2.Request(url.url) 
     if url.last_date == None: 
      now = datetime.now() 
      stamp = mktime(now.timetuple()) 
      url.last_date = format_date_time(stamp) 
      url.save() 

     request.add_header("If-Modified-Since", url.last_date) 

     try: 
      response = urllib2.urlopen(request) # Make the request 
      # some actions 
      now = datetime.now() 
      stamp = mktime(now.timetuple()) 
      url.last_date = format_date_time(stamp) 
      url.save() 
     except urllib2.HTTPError, err: 
      if err.code == 304: 
       print "nothing...." 
      else: 
       print "Error code:", err.code 
       pass 

私が間違っているかを理解していません。誰でも助けてくれますか?

+0

あなたは、Webページ、日付偽る必要があるかもしれないという事実を考慮しましたか? –

+0

@ princess-of-the-universeいいえ、私はこれを考慮していません。では、ページが変更されたかどうかを確認するにはどうすればよいですか?私も 'ハッシュ'で試しましたが、読み込むたびにページが変わります。 – RoverDar

答えて

5

Webサーバーは、「If-Modified-Since」ヘッダーを送信するときに、応答として304ヘッダーを送信する必要はありません。彼らは自由にHTTP 200を送信し、ページ全体を再度送信します。

「If-Modified-Since」または「If-None-Since」を送信すると、キャッシュされた応答を使用可能にするサーバーが警告されます。それは 'Accept-Encoding:gzip、deflate'ヘッダーを送信するようなものです。サーバーを指定するだけで、何かを受け入れることになります。要求する必要はありません。

+0

ありがとうございます。ページが変更されたかどうかを確認するにはどうすればよいですか? – RoverDar

+3

最も簡単な方法は、MD5ハッシュを使って各自のフィンガープリントを作成し、それをローカルに保存して比較することです。しかし、「メイン」コンテンツは変更されていないが、「広告」のさまざまなコンテンツ(広告タグ、宣伝物語、推奨リンク、パートナーリンクなど)が変更されていることが問題です。ページはmd5を投げ捨てます。 –

+0

たとえば、のみとすると便利ですか? – RoverDar

0

サイトが304を返すかどうかを確認する良い方法は、Google Chromeの開発ツールを使用することです。例えば。以下は、blsウェブサイトでchromeを使用した注釈付きの例です。リフレッシュし続けると、サーバーは304を返し続けます。Ctrl + F5(ウィンドウ)で強制的に更新すると、ステータスコード200が返されます。

この方法を使用して、サーバーが304を返さない場合、または何らかの理由で要求ヘッダーを間違ってフォーマットした場合。場合によっては、If-headerを尊重しないリソースがWebページにインポートされているため、200ページを返します(ページ上のリソースが304を返さない場合はページ全体が200を返します)。ウェブサイトの特定の部分を見るだけで、リソースを直接ロードして文書全体をバイパスすることで不正行為をすることができます。

関連する問題