web-dev-qa-db-ja.com

HEAD HTTPリクエストをPython 2で送信するにはどうすればよいですか?

ここでしようとしているのは、MIMEタイプを判別できるように、指定されたURLのヘッダーを取得することです。 http://somedomain/foo/は、たとえばHTMLドキュメントまたはJPEG画像を返します。したがって、コンテンツをダウンロードせずにMIMEタイプを読み取ることができるように、HEADリクエストを送信する方法を理解する必要があります。これを行う簡単な方法はありますか?

108
fuentesjr

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)もあります。

104
Eevee

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
107
doshea

必須 Requests 方法:

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
61
K Z

Requests ライブラリも言及すべきだと思います。

36
daliusd

ただ:

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'
...

リンクテキスト

16
Paweł Prażak

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)
8
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
2
Pranay Agarwal

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

他の誰かがこれについて入力をしていますか?

1
IgorGanapolsky

余談ですが、httplib(少なくとも2.5.2)を使用する場合、HEAD要求の応答を読み取ろうとすると、(readlineで)ブロックされ、その後失敗します。接続で別のリクエストを送信できない場合、新しいリクエストを開く必要があるか、リクエスト間の長い遅延を受け入れる必要があります。

1
Nope

さらに別のアプローチ(Pawelの回答と同様):

import urllib2
import types

request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)

インスタンスレベルで無制限のメソッドを使用しないようにするためです。

0
estani