ここでやろうとしているのは、指定された URL のヘッダーを取得して、MIME タイプを判別できるようにすることです。http://somedomain/foo/
たとえば、HTML ドキュメントまたは JPEG 画像を返すかどうかを確認できるようにしたいと考えています。したがって、コンテンツをダウンロードせずに MIME タイプを読み取れるように、HEAD 要求を送信する方法を理解する必要があります。これを行う簡単な方法を知っている人はいますか?
11 に答える
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
編集:この回答は機能しますが、最近は、以下の他の回答で説明されているように、リクエストライブラリを使用する必要があります。
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)
特定のヘッダーを取得するためのもあります。
必須のRequests
方法:
import requests
resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
Requestsライブラリについても言及する必要があると思います。
ただ:
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'
...
完全を期すために、httplibを使用して受け入れられた回答と同等のPython3回答を取得します。
ライブラリがhttplibではなくhttp.clientと呼ばれることは、基本的に同じコードです。
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 よりもわずかに高速であることがわかりました。1 つは httplib を使用し、もう 1 つは urllib2 を使用して、10,000 の URL に HEAD リクエストを送信する 2 つのプログラムの時間を計りました。httplib の方が数分高速でした。 httplibの合計統計は次のとおりです: real 6m21.334s user 0m2.124s sys 0m16.372s
そしてurllib2の合計統計は次のとおりです: real 9m1.380s user 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 は通常直接使用されないことに注意してください。