Python Requests快速入門

42743 ワード

原文の住所:http://blog.csdn.net/iloveyin/article/details/21444613
手っ取り早い
矢も盾もたまらないですか?このページの内容はどうやってRequestsに入るかについて良いガイドを提供します.それはあなたが既にRequestsをインストールしていると仮定します.まだ来ていないなら、行きます. インストール 一節を見てみましょう
まず、確認してみます.
Requests インストール済みRequestsは 最新のいくつかの簡単な例から始めましょう.
要求を送信する
Requestsを使ってネットワーク要求を送るのはとても簡単です.
最初にRequestsモジュールを導入します.
>>> import requests
そして、あるページを取得してみます.この例では、Githubの共通時間線を取得します.
>>> r = requests.get('https://github.com/timeline.json')
今、私たちは名前を持っています. r の Resonse オブジェクトこのオブジェクトから私たちが欲しい情報をすべて取得できます.
Requestsの簡単なAPIは、すべてのHTTP要求タイプが明らかであることを意味する.例えば、HTTP POST要求をこのように送信することができる.
>>> r = requests.post("http://httpbin.org/post")
綺麗でしょう?他のHTTP要求タイプ:PUT、DELETE、HEAD、OPTONSはどうなりますか?全部同じ簡単です.
>>> r = requests.put("http://httpbin.org/put")
>>> r = requests.delete("http://httpbin.org/delete")
>>> r = requests.head("http://httpbin.org/get")
>>> r = requests.options("http://httpbin.org/get")
全部いいですよね.でも、これはRequestsの氷山の一角だけです.
URLにパラメータを渡す
URLの照会文字列に、あるデータを転送したいと思っているかもしれません.もしあなたが手動でURLを構築するなら、データはキー/値ペアの形でURLに置き、疑問符の後に続く.例えば、httpbin.org/get?key=val . Requestsはあなたが使うことを許可します. パラms これらのパラメータは辞書で提供されます.例えば、伝えたいなら key 1=value 1 和 key 2=value 2 はい、 httpbin.org/get ,次のコードが使えます.
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)
このURLをプリントアウトすることで、URLが正しく符号化されていることが分かります.
>>> print r.url
u'http://httpbin.org/get?key2=value2&key1=value1'
応答内容
私たちはサーバーの応答の内容を読み取ることができます.再びGithubタイムラインを例にします.
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.text
'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requestsはサーバからのコンテンツを自動的に復号します.ほとんどのunicode文字セットはシームレスに復号されます.
要求が出された後、RequestsはHTTPヘッダに基づいて応答の符号化を推定します.r.textを訪問する時 その際、Requestsはその推測のテキストコードを使用します.Requestsにはどんなコードが使われていますか? r.encoding 属性を変えます
>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'
もしあなたがコードを変えたらあなたが訪問するたびに. r.text ,Requestは全部使います. r.encoding の新しい値を返します
必要な場合は、Requestsもカスタムコードを使用することができます.もしあなたが自分のコードを作成したら、codecsを使用します. モジュールを登録すると、このデコーダの名前を簡単に使うことができます. r.encoding の値を返して、それからRequestsによってあなたのためにコードを処理します.
バイナリ応答内容
あなたもバイトで要求応答体にアクセスできます.非テキスト要求に対して:
>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requestsは自動的にあなたのために復号します. gzip 和 deflate 符号化された応答データを伝送する.
例えば、リターンを要求するバイナリデータで画像を作成します.次のコードを使ってもいいです.
>>> from PIL import Image
>>> from StringIO import StringIO
>>> i = Image.open(StringIO(r.content))
JSON応答内容
RequestsにもJSONデコーダが内蔵されています.JSONデータの処理を助けます.
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...
JSON復号が失敗した場合、 r.json 異常を投げる.
元の応答内容
まれに見ると、サーバーからのオリジナルソケットの応答を取得したいかもしれません. r.raw . 本当にそうしたいなら、初期要求に設定してください. stream=True .具体的にはこのようにしてもいいです.
>>> r = requests.get('https://github.com/timeline.json', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
カスタム要求ヘッダ
HTTPヘッダを追加したいなら、簡単に伝えてください. プロジェクト はい、どうぞ headers パラメータだけでいいです.
例えば、前の例ではcontent-typeを指定していません.
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> headers = {'content-type': 'application/json'}

>>> r = requests.post(url, data=json.dumps(payload), headers=headers)
もっと複雑なPOSTリクエスト
通常、フォームとしてエンコードされたデータを送信したいです.HTMLフォームと似ています.これを実現するには、辞書を渡すだけで簡単です. ダタ パラメータあなたのデータ辞書は要求を出す時に自動的にフォーム形式にエンコードされます.
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print r.text
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}
多くの場合、あなたが送信したいデータはフォームとしてエンコードされていません.もしあなたが一つ伝えたら ストリングス 一つのdictではなく ,データはそのまま公開されます.
例えば、Github API v 3は、JSONとして符号化されたPOST/PATCHデータを受け取る.
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

>>> r = requests.post(url, data=json.dumps(payload))
POST多重部分コード化されたファイル
Requestsは、複数の部分の符号化ファイルをアップロードすることを簡単にします.
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}
ファイル名を明示的に設定できます.
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'))}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}
もしあなたが望むなら、ファイルとして受信した文字列を送ることもできます.
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send
another,row,to,send
')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "some,data,to,send\
another,row,to,send\
"
}, ... }
応答状態コード
応答状態コードを検出できます.
>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200
引用を容易にするために、Requestsには、内蔵された状態コードの照会対象が添付されています.
>>> r.status_code == requests.codes.ok
True
失敗した要求を送信したら(200応答ではない)、私達は通過できます. Reponse.rase_for_status() に異常を投げます
>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error
しかし、私たちの例では r の statusコード はい、 200 ,私たちが呼び出したら レイセ.for_status() を選択して得られたのは、
>>> r.raise_for_status()
None
すべてが調和していますね.
応答ヘッダ
Python辞書として展示されているサーバー応答ヘッダを確認できます.
>>> r.headers
{
    'status': '200 OK',
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '148ms',
    'etag': '"e1ca502697e5c9317743dc078f67693f"',
    'content-type': 'application/json; charset=utf-8'
}
しかし、この辞書は特殊です.HTTPの頭だけのためのものです.によると RFC 2616 , HTTPヘッダは、大文字小文字でデリケートではない.
したがって、これらの応答ヘッダフィールドには、任意の大文字でアクセスできます.
>>> r.headers['Content-Type']
'application/json; charset=utf-8'

>>> r.headers.get('content-type')
'application/json; charset=utf-8'
応答ヘッダフィールドが存在しない場合、そのデフォルトは ノン?ネ
>>> r.headers['X-Random']
None
Cookies
ある応答にいくつかのCookieが含まれている場合、それらに素早くアクセスできます.
>>> url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)

>>> r.cookies['example_cookie_name']
'example_cookie_value'
あなたのcookiesをサーバーに送りたいですが、使えます. cookies パラメータ:
>>> url = 'http://httpbin.org/cookies'
>>> cookies = dict(cookies_are='working')

>>> r = requests.get(url, cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
リダイレクトと要求履歴
GETやOPTONSを使うと、Requestsが自動的に位置を処理してリダイレクトします.
Githubは、すべてのHTTP要求をHTTPSにリダイレクトする.応答オブジェクトの history 方法を使ってリダイレクトを追跡します.私たちはGithubが何をしているかを見に来ました.
>>> r = requests.get('http://github.com')
>>> r.url
'https://github.com/'
>>> r.status_code
200
>>> r.history
[<Response [301]>]
Resonse.history 一つです.class:Request オブジェクトのリストは、要求を完了するために作成されます.このオブジェクトリストは一番古いものから一番近いものまでの要求に従って並べ替えられます.
もしあなたがGETやOPTIONSを使っているなら、それは通過できます. allow_redirects パラメータのリダイレクト処理を無効にします.
>>> r = requests.get('http://github.com', allow_redirects=False)
>>> r.status_code
301
>>> r.history
[]
POST、PUT、PATCH、DELETEまたはHEADを使用すれば、リダイレクトを有効にできます.
>>> r = requests.post('http://github.com', allow_redirects=True)
>>> r.url
'https://github.com/'
>>> r.history
[<Response [301]>]
タイムアウト
requestsの経過を教えてください. タイムアウト パラメータ設定の秒数時間後に応答待ちを停止します.
>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
注:
タイムアウト 接続プロセスにのみ有効で、応答体のダウンロードには関係ありません.
エラーと異常
ネットワーク問題(例えば、DNSクエリの失敗、接続拒否など)に遭遇した場合、RequestsはConnection Errorを投げ出します. 異常です
まれに見る無効なHTTP応答に対しては、Requestsは一つ投げます. HTTPError 異常です
タイムアウトを要求したら、一つを投げます. Timeout 異常です
設定された最大リダイレクト回数を超えて要求された場合、一つのスローアップが行われます. TooManyRedirects 異常です
Requests明示的に投げられたすべての異常は、自 requests.exceptions.Request Exception .