2010-08-27 14 views
9

Sie haben dies in der Python-Dokumentation nicht erwähnt. Und vor kurzem teste ich eine Website einfach die Website mit urllib2.urlopen() aktualisieren, um bestimmte Inhalte zu extrahieren, merke ich manchmal, wenn ich die Website urllib2.urlopen() zu aktualisieren scheint nicht die neu hinzugefügten Inhalte. Ich frage mich also, ob es irgendwo Cache-Sachen gibt, oder?Führt urllib2.urlopen() Cache Zeug?

+0

Webserver Cache Sachen auch. Das ist der übliche Schuldige. Überprüfen Sie die Header auf dem Ergebnis, und ** aktualisieren Sie Ihre Frage, um die 'info()' einzuschließen. –

+0

@ S.Lott: "Webserver-Cache stuff auch" Bedeutet es, wenn ich nicht die aktualisierten Ergebnisse mit urllib2.urlopen() erhalten, das ist hauptsächlich Webserver "wissen", es ist mir erfrischend und geben Sie mir nicht die aktualisierte Sachen? Gibt es eine Möglichkeit, den Server zu zwingen, die Daten jedes Mal neu zu übertragen, wenn ich die Site aktualisiere? – Shane

+0

Sofern Sie nicht eine Menge über den Webserver wissen, wissen Sie nicht wirklich, welche Caches es hat. Es könnte mehrere Cache-Ebenen haben. Es könnte Cache falsch konfiguriert haben.Es könnte Seiten enthalten, die keine Informationen zum Aktualisieren des Cache bereitstellen. Auf der Serverseite kann viel schief gehen. –

Antwort

9

Also ich frage mich, ob es Sachen irgendwo zwischenspeichern kann, richtig?

Es tut es nicht.

Wenn Sie keine neuen Daten sehen, könnte dies viele Gründe haben. Die meisten größeren Webdienste verwenden aus Leistungsgründen serverseitiges Caching, z. B. mithilfe von Caching-Proxys wie Varnish und Squid oder Caching auf Anwendungsebene.

Wenn das Problem durch das serverseitige Zwischenspeichern verursacht wird, ist es normalerweise nicht möglich, den Server dazu zu zwingen, Ihnen die neuesten Daten zu geben.


Für Caching-Proxies wie Tintenfisch, sind die Dinge anders. Normalerweise fügt squid der HTTP-Antwort einige zusätzliche Header hinzu (response().info().headers).

Wenn Sie ein Headerfeld mit den Namen X-Cache oder X-Cache-Lookup sehen, bedeutet dies, dass Sie nicht direkt mit dem Remote-Server verbunden sind, sondern über einen transparenten Proxy.

Wenn Sie etwas wie: X-Cache: HIT from proxy.domain.tld haben, bedeutet dies, dass die Antwort, die Sie erhalten, zwischengespeichert wird. Das Gegenteil ist X-Cache MISS from proxy.domain.tld, was bedeutet, dass die Antwort frisch ist.

+0

Danke, jetzt weiß ich, was das Problem ist. – Shane

-2

Es fällt mir schwer zu glauben, dass urllib2 kein Caching durchführt, weil in meinem Fall beim Neustart des Programms die Daten aktualisiert werden. Wenn das Programm nicht neu gestartet wird, werden die Daten anscheinend für immer zwischengespeichert. Das Abrufen der gleichen Daten aus Firefox gibt auch keine veralteten Daten zurück.

+2

urllib2 führt kein Caching durch. Vielleicht verwenden Sie einen Proxy oder die Webanwendung selbst speichert temporäre Daten. –

5

Sehr alte Frage, aber ich hatte ein ähnliches Problem, das diese Lösung nicht gelöst hat.
In meinem Fall hatte ich so die User-Agenten zu fälschen:

request = urllib2.Request(url) 
request.add_header('User-Agent', 'Mozilla/5.0') 
content = urllib2.build_opener().open(request) 

Hope this jemand kann ...

+0

Danke! Hatte das gleiche Problem beim Herunterladen von JSON von einem Drupal-Feed. Dies hat möglicherweise nichts mit Ihrem eigentlichen Python-Skript zu tun, sondern eher mit dem Server, von dem Sie Daten herunterladen. In unserem Fall hat der Server Inhalt basierend auf dem Benutzeragenten zwischengespeichert. –

0

Ihren Web-Server oder ein HTTP-Proxy-Inhalte werden das Caching hilft. Sie können versuchen, das Caching zu deaktivieren, indem Sie einen Pragma: no-cache Request-Header hinzugefügt:

request = urllib2.Request(url) 
request.add_header('Pragma', 'no-cache') 
content = urllib2.build_opener().open(request) 
0

Wenn Sie Änderungen und testen Sie das Verhalten von Browser und von urllib machen, ist es einfach, einen dummen Fehler zu machen. Im Browser sind Sie angemeldet, aber in urllib.urlopen kann Ihre App Sie immer auf dieselbe Anmeldeseite umleiten. Wenn Sie also nur die Seitengröße oder das obere Ende Ihres gemeinsamen Layouts sehen, könnten Sie denken, dass Ihre Änderungen keine Wirkung haben .

Verwandte Themen