最后修改下载的HTTP标头不匹配的文件(Last Modified of file download

2019-09-16 14:10发布

我有一个Python代码是(或好或坏)检查针对Web服务器上的同一个文件的本地文件。 如果它不存在,它的下载它,如果是的话,它会检查os.stat最后修改对服务器上的同一个文件的HTTP标头下载的文件的。

问题是,似乎这两个数字都没有,即使他们应该是平等的。 下面的代码:

from urllib import urlretrieve
from urllib2 import Request, urlopen
from time import strftime, localtime, mktime, strptime
from os import stat, path

destFile = "logo3w.png"
srvFile = "http://www.google.com/images/srpr/logo3w.png"

if path.exists(destFile):
    localLastModified = stat(destFile).st_mtime
    req = Request(srvFile)
    url_handle = urlopen(req)
    headers = url_handle.info()                        
    srvLastModified = headers.getheader("Last-Modified")
    srvLastModified = mktime(strptime(srvLastModified,
      "%a, %d %b %Y %H:%M:%S GMT"))
    print localLastModified, srvLastModified

else:
    urlretrieve(srvFile, destFile)

在返回print语句(如果你运行代码两次)为1334527395.26 1333350817.0

在我看来,这两个应该是相同的,但它们是完全不同的。 修改本地下载的文件的日期是在事实上它被下载到本地机器,而不是在服务器上的最后修改日期。

基本上所有我想要做的就是保持文件的本地缓存(将是一个很大的实际应用程序文件),如果需要下载它。 我是半个意识到网络代理应在默认情况下做到这一点,我运行这些文件存储在一个基本的WAMP的服务器,但我不知道如何将其应用到我的PyQt的应用程序。 有潜在的几十种将需要下载并缓存,并且其中半数很少会发生变化的文件,所以我想确定要检查并抓住这些文件的最快方式。

也许,这甚至不是去了解它的正确方法,所以我所有的耳朵,如果有(更好的/许多其他)的方式来做到这一点。

Answer 1:

urllib.urlretrieve刚刚下载的文件; 它不会复制修改日期。 您必须手动执行这样使用os.utime

import os

# current code
else:
    headers = urlretrieve(srvFile, destFile)[1]
    lmStr = headers.getheader("Last-Modified")
    srvLastModified = mktime(strptime(lmStr, "%a, %d %b %Y %H:%M:%S GMT"))
    os.utime(destFile, (srvLastModified, srvLastModified))


文章来源: Last Modified of file downloaded does not match its HTTP header