彼らはPythonのドキュメントでこれについて言及していませんでした。そして最近、urllib2.urlopen()を使用して特定のコンテンツを抽出するだけでサイトを更新するWebサイトをテストしていますが、サイトを更新すると、urllib2.urlopen()が新しく追加されたコンテンツを取得しないように見えることがあります。だから、どこかにキャッシュがあるのだろうか?
5 に答える
だから、どこかにキャッシュがあるのだろうか?
そうではありません。
新しいデータが表示されない場合、これには多くの理由が考えられます。ほとんどの大規模なWebサービスは、パフォーマンス上の理由からサーバー側のキャッシュを使用します。たとえば、VarnishやSquidなどのキャッシュプロキシやアプリケーションレベルのキャッシュを使用します。
問題の原因がサーバー側のキャッシュである場合、通常、サーバーに最新のデータを提供させる方法はありません。
イカのようなキャッシングプロキシの場合、状況は異なります。通常、squidはHTTP応答にいくつかの追加ヘッダーを追加します(response().info().headers
)。
X-Cache
またはというヘッダーフィールドX-Cache-Lookup
が表示されている場合は、リモートサーバーに直接接続されていないが、透過プロキシを介して接続されていることを意味します。
次のようなものがある場合X-Cache: HIT from proxy.domain.tld
、これは、取得した応答がキャッシュされることを意味します。反対はですX-Cache MISS from proxy.domain.tld
。これは、応答が新鮮であることを意味します。
非常に古い質問ですが、この解決策では解決できない同様の問題がありました。
私の場合、次のようにUser-Agentをスプーフィングする必要がありました。
request = urllib2.Request(url)
request.add_header('User-Agent', 'Mozilla/5.0')
content = urllib2.build_opener().open(request)
これが誰かに役立つことを願っています...
WebサーバーまたはHTTPプロキシがコンテンツをキャッシュしている可能性があります。Pragma: no-cache
リクエストヘッダーを追加して、キャッシュを無効にすることができます。
request = urllib2.Request(url)
request.add_header('Pragma', 'no-cache')
content = urllib2.build_opener().open(request)
ブラウザとurllibから変更を加えて動作をテストすると、ばかげた間違いを犯しやすくなります。ブラウザではログインしていますが、urllib.urlopenでは、アプリは常に同じログインページにリダイレクトできるため、ページサイズまたは一般的なレイアウトの上部だけが表示されている場合は、変更による影響はないと考えることができます。
私の場合、プログラムを再起動するとデータが更新されるため、urllib2がキャッシュを実行しないとは信じがたいです。プログラムを再起動しないと、データは永久にキャッシュされているように見えます。また、Firefoxから同じデータを取得しても、古いデータが返されることはありません。