Ich möchte ohne die Dateien herunterladen zu müssen, die letzte Veränderung der Datei oder den letzten upload per ftp feststellen. Letzteres dürfte aber glaub ich ohne eigenen ftp Access schwierig sein. Die os.path Module kann ich leider nicht verwenden, da ich die Datei nicht downloaden möchte.
Hat jemand eine Idee wie man das Problem lösen könnte.
Änderungen von Dateien auf Server per timestamp überwachen
Z. B. so. Du musst das Datum allerdings in dieser Version immer in UTC-Zeit haben
Code: Alles auswählen
import urllib2
import datetime
d = datetime.datetime.utcnow()
def rfc1123(utcdate):
return utcdate.strftime("%a, %d %b %Y %H:%M:%S GMT")
req = urllib2.Request(url='http://www.google.de/intl/de_de/images/logo.gif',
headers={"If-Modified-Since": rfc1123(d)})
try:
f = urllib2.urlopen(req)
print f.read()
except urllib2.HTTPError, e:
if e.code == 304:
print "Nicht modifiziert"
else:
raise e
Kann man den head-request auch einfach anzeigen lassen? Ich möchte zwei Dateien vergleichen und die neuere herunterladen, sodass ich die beiden head-request miteinander vergleichen muss.
@ Joghurt danke für das Beispiel, es ist aber nicht ganz sinnvoll, die aktuelle Zeit an If-Modified-Since zu übergeben.
@ Joghurt danke für das Beispiel, es ist aber nicht ganz sinnvoll, die aktuelle Zeit an If-Modified-Since zu übergeben.
Ich habe das Problem lösen können, doch leider findet .info() in einigen Adressen Last-Modified nicht. Also funktioniert diese Lösung nicht immer.
Code: Alles auswählen
#!/usr/bin/env python
import urllib2
f = urllib2.urlopen('Adresse')
try:
date=f.info()
print date['Last-Modified']
req = urllib2.Request(url='Adresse2',
headers={"If-Modified-Since": date['Last-Modified']})
try:
d = urllib2.urlopen(req)
data=d.read()
d = file("Datei", "w")
d.write(data)
d.close()
except urllib2.HTTPError, e:
if e.code == 304:
print "Nicht modifiziert"
else:
raise e
except KeyError:
pass
f.close()
Eventuell wird ja ein ETag-Header gesendet, anhand dem man schauen kann, ob sich der Inhalt geändert hat oder aber du hast eben Pech und der Server sagt dir halt nicht, ob sich der Inhalt geändert hat.
Hier bietet sich das Kommandozeilen-Tool "curl" an:Ubuntuxer hat geschrieben:Kann man den head-request auch einfach anzeigen lassen?
Code: Alles auswählen
sma$ curl -I www.yahoo.com
HTTP/1.1 200 OK
Date: Sun, 22 Jun 2008 08:55:04 GMT
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control: private
Vary: User-Agent
X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
Last-Modified: Sun, 22 Jun 2008 08:43:36 GMT
Accept-Ranges: bytes
Content-Length: 9562
Connection: close
Content-Type: text/html; charset=utf-8
sma$