web-dev-qa-db-ja.com

PythonでHTTP GETを実行するための最も簡単な方法は何ですか?

コンテンツが文字列になることがわかっている場合、PythonでHTTP GETを実行する最も簡単な方法は何ですか?私は次のような簡単なワンライナーをドキュメントで探しています。

contents = url.get("http://example.com/foo/bar")

しかし、私がGoogleを使って見つけることができるのはhttpliburllibだけです - そして私はそれらのライブラリーにショートカットを見つけることができません。

標準のPython 2.5には上記のような形式のショートカットがありますか、それとも関数url_getを書くべきですか?

  1. 私はwgetcurlへのシェルアウトの結果を取り込まないことを望みます。
523
Frank Krueger

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 のドキュメント。

それはどうですか?

770
Nick Presta

request というライブラリを使うことができます。

import requests
r = requests.get("http://example.com/foo/bar")

これはとても簡単です。それからあなたはこのようにすることができます:

>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)
360
user1001237

Httplib2を使った解決策を手に入れたい場合は、匿名のHttpオブジェクトのインスタンス化を検討してください。

import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")
28
to-chomik

httplib2 を見てください - これは - 非常に便利な機能の多くの隣に - まさにあなたが望むものを提供します。

import httplib2

resp, content = httplib2.Http().request("http://example.com/foo/bar")

Contentがレスポンスボディ(文字列として)で、respがステータスとレスポンスヘッダを含みます。

ただし、標準のpythonインストールには含まれていません(ただし、標準のpythonのみが必要です)が、確かにチェックする価値があります。

18
Steven

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
6
Xuan

これが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
5
theller

ヘッダを送る方法

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のようにキャンセルされます。

4
michael_s

優れた解決策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タイプエラーが返されます。

3
Akshar

特に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())

その他の例: https://github.com/kimmobrunfeldt/nap#examples

2
Kimmo

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"
})
2
Juniorized