Python:車HTTPヘッダからurllib2.urlopen電話のかけ方は?
-
20-08-2019 - |
質問
は 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.
他のヒント
何の代わりに、通常のGETリクエストのHEADリクエストを送信してについて。以下は同様の質問)、まさにその作業を行います。
>>> import httplib
>>> conn = httplib.HTTPConnection("www.google.com")
>>> conn.request("HEAD", "/index.html")
>>> res = conn.getresponse()
>>> print res.status, res.reason
200 OK
>>> print res.getheaders()
[('content-length', '0'), ('expires', '-1'), ('server', 'gws'), ('cache-control', 'private, max-age=0'), ('date', 'Sat, 20 Sep 2008 06:43:36 GMT'), ('content-type', 'text/html; charset=ISO-8859-1')]
実際には、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)
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