8

在我的 python 应用程序中,我必须阅读许多网页来收集数据。为了减少 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 网站上使用 chrome 的带注释示例。继续刷新,你会看到服务器一直返回 304。如果你用 Ctrl+F5(windows)强制刷新,你会看到它返回状态码 200。

您可以在示例中使用此技术来确定服务器是否不返回 304,或者您是否以某种方式错误地格式化了请求标头。有时网页上导入了不尊重 If- 标头的资源,因此无论您做什么它都会返回 200(如果页面上的任何资源不返回 304,则整个页面将返回 200),但有时您是只查看网站的特定部分,您可以通过直接加载资源并绕过整个文档来作弊。

于 2016-03-04T14:13:00.010 回答