8

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

何が問題なのかわかりません。誰でも私を助けることができますか?

4

2 に答える 2

5

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

「If-Modified-Since」または「If-None-Since」を送信すると、利用可能な場合はキャッシュされた応答が必要であることをサーバーに警告します。これは、'Accept-Encoding: gzip, deflate' ヘッダーを送信するようなものです。サーバーに対して、要求ではなく、何かを受け入れることを伝えているだけです。

于 2013-03-04T17:26:33.270 に答える
0

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

例でこの手法を使用して、サーバーが 304 を返さないかどうか、またはリクエスト ヘッダーの形式が間違っているかどうかを調べることができます。場合によっては、Web ページに If- ヘッダーを尊重しないリソースがインポートされていることがあるため、何をしても 200 が返されます (ページ上のリソースが 304 を返さない場合、ページ全体が 200 を返します)。 Web サイトの特定の部分だけを見ていると、リソースを直接読み込んでドキュメント全体をバイパスすることでごまかすことができます。

于 2016-03-04T14:13:00.010 に答える