コンテンツが文字列になることがわかっている場合、PythonでHTTP GETを実行する最も簡単な方法は何ですか?私は次のような簡単なワンライナーをドキュメントで探しています。
contents = url.get("http://example.com/foo/bar")
しかし、私がGoogleを使って見つけることができるのはhttplib
とurllib
だけです - そして私はそれらのライブラリーにショートカットを見つけることができません。
標準のPython 2.5には上記のような形式のショートカットがありますか、それとも関数url_get
を書くべきですか?
wget
やcurl
へのシェルアウトの結果を取り込まないことを望みます。Python 2.x:
import urllib2
contents = urllib2.urlopen("http://example.com/foo/bar").read()
Python 3.x:
import urllib.request
contents = urllib.request.urlopen("http://example.com/foo/bar").read()
urllib.request および read のドキュメント。
それはどうですか?
request というライブラリを使うことができます。
import requests
r = requests.get("http://example.com/foo/bar")
これはとても簡単です。それからあなたはこのようにすることができます:
>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
Httplib2を使った解決策を手に入れたい場合は、匿名のHttpオブジェクトのインスタンス化を検討してください。
import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
httplib2 を見てください - これは - 非常に便利な機能の多くの隣に - まさにあなたが望むものを提供します。
import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
Contentがレスポンスボディ(文字列として)で、respがステータスとレスポンスヘッダを含みます。
ただし、標準のpythonインストールには含まれていません(ただし、標準のpythonのみが必要です)が、確かにチェックする価値があります。
wgetに対するthelerの解決策は本当に便利です、しかし、私はそれがダウンロードプロセスを通して進歩をプリントアウトしないことがわかりました。 reporthookのprintステートメントの後に1行追加すれば完璧です。
import sys, urllib
def reporthook(a, b, c):
print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c),
sys.stdout.flush()
for url in sys.argv[1:]:
i = url.rfind("/")
file = url[i+1:]
print url, "->", file
urllib.urlretrieve(url, file, reporthook)
print
これがPythonのwgetスクリプトです。
# From python cookbook, 2nd edition, page 487
import sys, urllib
def reporthook(a, b, c):
print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c),
for url in sys.argv[1:]:
i = url.rfind("/")
file = url[i+1:]
print url, "->", file
urllib.urlretrieve(url, file, reporthook)
print
ヘッダを送る方法
Python 3:
import urllib.request
contents = urllib.request.urlopen(urllib.request.Request(
"https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases/latest",
headers={"Accept" : 'application/vnd.github.full+json"text/html'}
)).read()
print(contents)
Python 2:
import urllib2
contents = urllib2.urlopen(urllib2.Request(
"https://api.github.com",
headers={"Accept" : 'application/vnd.github.full+json"text/html'}
)).read()
print(contents)
これ以上必要なインポートがなければ、この解決策は(私にとっては)うまくいきます - https:
try:
import urllib2 as urlreq # Python 2.x
except:
import urllib.request as urlreq # Python 3.x
req = urlreq.Request("http://example.com/foo/bar")
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36')
urlreq.urlopen(req).read()
ヘッダ情報に "User-Agent"を指定していないと、コンテンツをつかむのが困難になります。その後、通常、リクエストはurllib2.HTTPError: HTTP Error 403: Forbidden
またはurllib.error.HTTPError: HTTP Error 403: Forbidden
のようにキャンセルされます。
優れた解決策Xuan、Theller。
Python 3で動作するようにするには、次のように変更します。
import sys, urllib.request
def reporthook(a, b, c):
print ("% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c))
sys.stdout.flush()
for url in sys.argv[1:]:
i = url.rfind("/")
file = url[i+1:]
print (url, "->", file)
urllib.request.urlretrieve(url, file, reporthook)
print
また、入力するURLの前には「http://」を付ける必要があります。そうしないと、不明なURLタイプエラーが返されます。
特にHTTP APIを使用している場合は、 Nap のようにもっと便利な選択肢もあります。
例えば、以下はGithubから要旨を取得する方法です。 2014年5月1日 :
from nap.url import Url
api = Url('https://api.github.com')
gists = api.join('gists')
response = gists.get(params={'since': '2014-05-01T00:00:00Z'})
print(response.json())
urllib3
を使えば十分簡単です。
このようにインポートしてください。
import urllib3
pool_manager = urllib3.PoolManager()
そして、このようなリクエストをしてください。
example_request = pool_manager.request("GET", "https://example.com")
print(example_request.data.decode("utf-8")) # Response text.
print(example_request.status) # Status code.
print(example_request.headers["Content-Type"]) # Content type.
ヘッダを追加することもできます。
example_request = pool_manager.request("GET", "https://example.com", headers = {
"Header1": "value1",
"Header2": "value2"
})