質問

urllib2 を取り出し全体でページが urlopen 呼び出しが行われたあとで?

思うのHTTPリダイレクトのHTTPレスポンスヘッダなしのページです。のようにな urllib2 開、HTTPで接続し、その後の実際のHTMLページ---いずれも無料でご利用いただけバッファリングとそのページに urlopen 電話のかけ方は?

import urllib2
myurl = 'http://www.kidsidebyside.org/2009/05/come-and-draw-the-circle-of-unity-with-us/'
page = urllib2.urlopen(myurl) // open connection, get headers

html = page.readlines()  // stream page
役に立ちましたか?

解決

をご利用 response.info() を取得するメソッドをツールを提供します。

から urllib2docs:

urllib2.urlopen(url[データ][,タイムアウト])

...

この関数が返すファイルのようなオブジェクトを追加方法:

  • geturl()の返URLのリソースの検索に使われている場合は、リダイレクトした
  • 情報()、メタ情報のページなどのヘッダ形式のhttplib.HTTPMessageインスタンス(クイック-リファレンスへのHTTPヘッダ)

ですから、おとえば、ステッピングの結果 response.info().headers います。

注記の点に注意をhttplib.HTTPMessageは記録され pythonの問題4773.

他のヒント

実際には、urllib2のがHTTP HEADリクエストを行うことができます表示されます。

その@reto

質問上記、にリンクされている、HEADリクエストを行うにはurllib2のを取得する方法を示しています。

ここでの私のテイクがあります:

import urllib2

# Derive from Request class and override get_method to allow a HEAD request.
class HeadRequest(urllib2.Request):
    def get_method(self):
        return "HEAD"

myurl = 'http://bit.ly/doFeT'
request = HeadRequest(myurl)

try:
    response = urllib2.urlopen(request)
    response_headers = response.info()

    # This will just display all the dictionary key-value pairs.  Replace this
    # line with something useful.
    response_headers.dict

except urllib2.HTTPError, e:
    # Prints the HTTP Status code of the response but only if there was a 
    # problem.
    print ("Error code: %s" % e.code)

あなたがWiresharkのネットワークプロトコルanalazerのようなものでこれを確認した場合、あなたはそれが実際にではなくGETよりも、HEADリクエストを送信していることがわかります。

Wiresharkのによって捕捉されるよう

これは、上記のコードからのHTTPリクエストとレスポンスである

  

HEAD / doFeT HTTP / 1.1は、エンコーディングを受け入れ
:アイデンティティ
ホスト:   bit.ly
接続:近くの
のUser-Agent:Pythonの-urllibは/ 2.7

     

HTTP / 1.1 301移動
サーバー:nginxの
日:日、2012年2月19日   夜01時20分56秒GMTの
のContent-Type:text / htmlの。文字セット= UTF-8
  キャッシュ制御:プライベート。 MAX-年齢= 90
場所:   
http://www.kidsidebyside.org/?p=445
MIME-バージョン:1.0
  コンテンツの長さ:127
接続:近くのSet-Cookieを
:   _bit = 4f40f738-00153-02ed0-421cf10a;ドメイン= .bit.ly;有効期限が切れる=金8月17日午前13時20分56秒2012;パス= /; HttpOnlyの

しかし、問題のURLがリダイレクトが含まれている場合、他の質問のコメントの1で述べたように、その後urllib2のが先ではなく、HEADにGETリクエストを行います。あなたが本当に唯一のHEADリクエストを作りたかった場合、これは、主な欠点可能性があります。

上記要求はリダイレクトすることを含みます。ここでのWiresharkによって捕捉されるように、宛先へのリクエストである

  

GET / 2009/05 /が来-とドロー・サークル・オブ・ユニティと-US / HTTP / 1.1
  受け入れ-エンコード:アイデンティティ
ホスト:www.kidsidebyside.org
  接続:近くの
のUser-Agent:Pythonの-urllibは/ 2.7

urllib2のを使用する代わりに、ジョー・グレゴリオの httplib2 に使用することですライブラリます:

import httplib2

url = "http://bit.ly/doFeT"
http_interface = httplib2.Http()

try:
    response, content = http_interface.request(url, method="HEAD")
    print ("Response status: %d - %s" % (response.status, response.reason))

    # This will just display all the dictionary key-value pairs.  Replace this
    # line with something useful.
    response.__dict__

except httplib2.ServerNotFoundError, e:
    print (e.message)

これは、最初のHTTPリクエストとリンク先URLにリダイレクトされたリクエストの両方に対してHEADリクエストを使用することの利点を持っています。

ここで最初のリクエストです。

  

HEAD / doFeT HTTP / 1.1
ホスト:受け入れるエンコード
bit.ly:GZIPを、   
ユーザーエージェントを収縮:Pythonの-httplib2 / 0.7.2(GZIP)

ここで先に2番目の要求は、います:

  

HEAD / 2009/05 /来-とドロー・サークル・オブ・ユニティと-US / HTTP / 1.1
  ホスト:www.kidsidebyside.org
受け入れエンコード:gzipのを、
デフレート   ユーザーエージェント:Pythonの-httplib2 / 0.7.2(GZIP)

(あなたがデータ引数を指定した場合またはPOST)

urllib2.urlopenは(それは後者をした場合、あなたはreadlinesを行うことができませんでしたか、他のはもちろん、ページ本体へのアクセス)ではなく、HTTPのHEAD HTTPのGETを行います。

ワンライナーます:

$ python -c "import urllib2; print urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)).open(urllib2.Request('http://google.com'))"
def _GetHtmlPage(self, addr):
  headers = { 'User-Agent' : self.userAgent,
            '  Cookie' : self.cookies}

  req = urllib2.Request(addr)
  response = urllib2.urlopen(req)

  print "ResponseInfo="
  print response.info()

  resultsHtml = unicode(response.read(), self.encoding)
  return resultsHtml  
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top