Python 2 で HEAD HTTP リクエストを送信するにはどうすればよいですか?
-
01-07-2019 - |
質問
ここでやろうとしているのは、指定された URL のヘッダーを取得して、MIME タイプを判断できるようにすることです。かどうかを確認できるようにしたい http://somedomain/foo/
たとえば、HTML ドキュメントまたは JPEG 画像が返されます。したがって、コンテンツをダウンロードせずに MIME タイプを読み取ることができるように、HEAD リクエストを送信する方法を理解する必要があります。誰かこれを行う簡単な方法を知っていますか?
解決
編集:この答えは機能しますが、今日では単に使用する必要があります リクエスト 以下の他の回答で述べたように、ライブラリ。
使用 httplib.
>>> 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')]
もあります getheader(name)
特定のヘッダーを取得します。
他のヒント
URLlib2 HEAD リクエストを実行するために使用できます。これは、URL をホスト名とパスに分割する必要がなく、urllib2 が URL を解析するため、httplib を使用するよりも少し優れています。
>>> import urllib2
>>> class HeadRequest(urllib2.Request):
... def get_method(self):
... return "HEAD"
...
>>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))
ヘッダーは、以前と同様に、response.info() 経由で利用できます。興味深いことに、リダイレクト先の URL が見つかります。
>>> print response.geturl()
http://www.google.com.au/index.html
義務的 Requests
方法:
import requests
resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
私は信じます リクエスト ライブラリについても言及する必要があります。
ただ:
import urllib2
request = urllib2.Request('http://localhost:8080')
request.get_method = lambda : 'HEAD'
response = urllib2.urlopen(request)
response.info().gettype()
編集:httplib2 があることに今気づきました:D
import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert resp[0]['status'] == 200
assert resp[0]['content-type'] == 'text/html'
...
完全を期すために、次を使用して受け入れられた回答と同等の Python3 回答を取得します。 httplib.
ライブラリが呼び出されないだけで、基本的には同じコードです。 httplib もう、しかし http.クライアント
from http.client import HTTPConnection
conn = HTTPConnection('www.google.com')
conn.request('HEAD', '/index.html')
res = conn.getresponse()
print(res.status, res.reason)
import httplib
import urlparse
def unshorten_url(url):
parsed = urlparse.urlparse(url)
h = httplib.HTTPConnection(parsed.netloc)
h.request('HEAD', parsed.path)
response = h.getresponse()
if response.status/100 == 3 and response.getheader('Location'):
return response.getheader('Location')
else:
return url
余談ですが、httplib (少なくとも 2.5.2 では) を使用している場合、HEAD リクエストの応答を読み取ろうとすると (readline で) ブロックされ、その後失敗します。応答に対して read を発行しない場合、接続上で別のリクエストを送信できません。新しいリクエストを開く必要があります。または、リクエスト間の長い遅延を受け入れます。
httplib は urllib2 よりわずかに高速であることがわかりました。2 つのプログラム (1 つは httplib を使用し、もう 1 つは urllib2 を使用) が 10,000 の URL に HEAD リクエストを送信する時間を測定しました。httplib の方が数分速かったです。 httplibの合計統計は次のとおりです。REAL 6M21.334Sユーザー0M2.124S SYS 0M16.372S
そして URLlib2の合計統計は次のとおりです。REAL 9M1.380Sユーザー0M16.666S SYS 0M28.565S
これについて他に意見のある人はいますか?
そしてさらに別のアプローチ(Pawelの答えに似ています):
import urllib2
import types
request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)
インスタンスレベルで無制限のメソッドを持たないようにするためです。
おそらくもっと簡単でしょう:urllib または urllib2 を使用します。
>>> import urllib
>>> f = urllib.urlopen('http://google.com')
>>> f.info().gettype()
'text/html'
f.info() は辞書のようなオブジェクトなので、 f.info()['content-type'] などが実行できます。
http://docs.python.org/library/urllib.html
http://docs.python.org/library/urllib2.html
http://docs.python.org/library/httplib.html
ドキュメントには、httplib は通常は直接使用されないことが記載されています。