2010-08-27 64 views
9

他們沒有在python文檔中提到這一點。最近我正在測試一個網站,只是使用urllib2.urlopen()來提取某些內容,而我更新網站時會注意到urllib2.urlopen()似乎不會獲得新添加的內容。所以我不知道它在什麼地方緩存東西,對吧?是否urllib2.urlopen()緩存內容?

+0

Web服務器也緩存一些東西。這是通常的罪魁禍首。檢查結果上的標題,並**更新**你的問題以包含'info()'。 – 2010-08-27 16:45:57

+0

@ S.Lott:「Web服務器緩存內容」是否意味着如果我沒有使用urllib2.urlopen()獲取更新後的結果,那主要是Web服務器「知道」這是我令人耳目一新的,不要給我更新東東?每當我刷新網站時,是否有辦法強制服務器重新傳輸數據? – Shane 2010-08-27 16:54:59

+0

除非您知道有關Web服務器的許多**,否則您並不知道它具有什麼緩存。它可以有多個級別的緩存。它可能配置不正確的緩存。它可能有頁面不提供刷新緩存的信息。服務器端可能會出錯。 – 2010-08-27 17:07:01

回答

9

所以我不知道它緩存的東西在某個地方,對吧?

它沒有。

如果您沒有看到新的數據,這可能有很多原因。出於性能原因,大多數較大的Web服務都使用服務器端緩存,例如使用Varnish和Squid之類的緩存代理或應用程序級緩存。

如果問題是由服務器端緩存導致的,通常無法強制服務器爲您提供最新數據。


對於像squid這樣的高速緩存代理,事情是不同的。通常,魷魚會在HTTP響應中添加一些額外的標頭(response().info().headers)。

如果您看到名爲X-CacheX-Cache-Lookup的標題字段,這意味着您沒有直接連接到遠程服務器,而是通過透明代理。

如果你有類似的東西:X-Cache: HIT from proxy.domain.tld,這意味着你得到的響應被緩存。相反的是X-Cache MISS from proxy.domain.tld,這意味着響應是新鮮的。

+0

謝謝,現在我知道問題是什麼。 – Shane 2010-08-27 17:46:55

-2

我很難相信urllib2沒有做緩存,因爲在我的情況下,重新啓動程序後數據會刷新。如果程序沒有重新啓動,數據似乎永遠被緩存。從Firefox中檢索相同的數據也不會返回陳舊的數據。

+2

urllib2不會執行緩存。也許你正在使用代理,或者Web應用程序本身正在存儲臨時數據。 – 2010-10-14 19:45:46

5

非常古老的問題,但我有一個類似的問題,這個解決方案沒有解決。
在我而言,我不得不欺騙用戶代理是這樣的:

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

希望這有助於任何人......

+0

謝謝!從Drupal Feed下載JSON時遇到同樣的問題。這可能與您的實際python腳本沒有任何關係,而是您要從中下載數據的服務器。在我們的例子中,服務器緩存基於用戶代理的內容。 – 2016-06-03 21:26:24

0

你的Web服務器或HTTP代理可緩存內容。您可以嘗試通過添加Pragma: no-cache請求頭禁用緩存:

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

如果進行了更改,並從瀏覽器,並從urllib的測試行爲,很容易做出愚蠢的錯誤。 在瀏覽器中您已登錄,但在urllib.urlopen中,您的應用可以將您始終重定向到相同的登錄頁面,因此如果您只是看到頁面大小或常見佈局的頂部,則可以認爲您的更改沒有效果。