ここでしようとしているのは、MIMEタイプを判別できるように、指定されたURLのヘッダーを取得することです。 http://somedomain/foo/
は、たとえばHTMLドキュメントまたはJPEG画像を返します。したがって、コンテンツをダウンロードせずにMIMEタイプを読み取ることができるように、HEADリクエストを送信する方法を理解する必要があります。これを行う簡単な方法はありますか?
edit:この回答は機能しますが、最近では、以下の他の回答で言及されているように、単に requests ライブラリを使用する必要があります。
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)
もあります。
rllib2 は、HEADリクエストを実行するために使用できます。urllib2はURLを分割する代わりに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
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がurllib2よりわずかに速いことがわかりました。 httplibを使用するプログラムとurllib2を使用するプログラムの2つのプログラムの時間を計りました-HEAD 10,000件のURLにリクエストを送信します。httplibの方が数分高速でした。httplib 's total統計は次のとおりでした:実6m21.334sユーザー0m2.124s sys 0m16.372s
そしてrllib2の合計統計は次のとおりでした:実際の9m1.380sユーザー0m16.666s sys 0m28.565s
他の誰かがこれについて入力をしていますか?
余談ですが、httplib(少なくとも2.5.2)を使用する場合、HEAD要求の応答を読み取ろうとすると、(readlineで)ブロックされ、その後失敗します。接続で別のリクエストを送信できない場合、新しいリクエストを開く必要があるか、リクエスト間の長い遅延を受け入れる必要があります。
さらに別のアプローチ(Pawelの回答と同様):
import urllib2
import types
request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)
インスタンスレベルで無制限のメソッドを使用しないようにするためです。