python requestsライブラリ入門〔回転〕
25871 ワード
まず、確認します. Requests がインストールされています. Requestsは最新の です
簡単な例から始めましょう.
リクエストの送信
Requestsを使用してネットワークリクエストを送信するのは簡単です.
最初にRequestsモジュールをインポートするには、次の手順に従います.
次に、Webページを取得してみます.この例ではGithubの共通タイムラインを取得します
今、rというResponseオブジェクトがあります.このオブジェクトから私たちが望むすべての情報を取得できます.
Requestsの簡便なAPIは、すべてのHTTP要求タイプが明らかであることを意味する.例えば、HTTP POSTリクエストを送信することができます.
きれいですね.では、他のHTTPリクエストタイプ:PUT、DELETE、HEAD、OPTIONSはどうでしょうか.同じように簡単です.
どれもいいでしょうが、これもRequestsの氷山の一角ですね.
URLにパラメータを渡す
URLのクエリー文字列(query string)にデータを渡したいことが多いかもしれません.手動でURLを構築する場合、データはキー/値ペアの形式でURLに配置され、疑問符の後ろに表示されます.例えばhttpbin.org/get?key=val . Requestsでは、paramsキーワードパラメータを使用して、これらのパラメータを辞書で提供できます.例えば、key 1=value 1とkey 2=value 2をhttpbinに伝えたい場合.org/getでは、次のコードを使用できます.
このURLを印刷出力すると、URLが正しく符号化されていることがわかります.
応答内容
サーバ応答の内容を読み取ることができます.再びGithubタイムラインを例に挙げます.
Requestsは、サーバからのコンテンツを自動的に復号します.ほとんどのunicode文字セットはシームレスに復号できます.
リクエストが発行されると,RequestsはHTTPヘッダに基づいて応答の符号化に根拠のある推測を行う.r.textにアクセスすると、Requestsはその推定テキスト符号化を使用します.Requestsがどのような符号化を使用しているかを見つけることができ、r.encodingプロパティを使用して変更することができます.
符号化を変更すると、r.textにアクセスするたびに、Requestはr.encodingの新しい値を使用します.
必要に応じて、Requestsはカスタムコードを使用することもできます.独自の符号化を作成し、codecsモジュールを使用して登録すると、このデコーダ名をr.encodingの値として簡単に使用し、Requestsによって符号化を処理することができます.
バイナリレスポンスコンテンツ
非テキストリクエストに対して、リクエスト応答体にバイトでアクセスすることもできます.
Requestsは、gzipおよびdeflate伝送符号化の応答データを自動的に復号します.
たとえば、返されたバイナリデータを要求して画像を作成します.次のコードを使用できます.
JSON応答内容
RequestsにもJSONデコーダが内蔵されており、JSONデータの処理に役立ちます.
JSON復号に失敗すると、r.jsonは異常を投げ出す.
元のレスポンス内容
珍しい場合、サーバからの元のソケット応答を取得したい場合は、r.rawにアクセスできます.本当にそうしたい場合は、初期リクエストにstream=Trueが設定されていることを確認してください.具体的には
カスタムリクエストヘッダ
リクエストにHTTPヘッダを追加したい場合は、headersパラメータにdictを簡単に渡すだけでいいです.
たとえば、前の例ではcontent-typeを指定していません.
より複雑なPOSTリクエスト
通常、HTMLフォームによく似たフォームとしてエンコードされたデータを送信します.これを実現するには、dataパラメータに辞書を簡単に渡すだけです.データ辞書は、要求を発行すると自動的にフォーム形式に符号化されます.
多くの場合、送信したいデータはフォーム形式に符号化されていません.dictではなくstringを渡すと、データは直接公開されます.
例えば、Github API v 3は、JSONとして符号化されたPOST/PATCHデータを受け取る.
POSTマルチセクション符号化(Multipart-Encoded)ファイル
Requestsは、複数のエンコードファイルのアップロードを簡単にします.
ファイル名を明示的に設定できます.
ファイルとして受信する文字列を送信することもできます.
レスポンスステータスコード
応答ステータスコードを検出できます.
参照を容易にするために、Requestsには、組み込みのステータスコードクエリーオブジェクトも付属しています.
失敗したリクエスト(200以外の応答)が送信された場合、Responseを介して.raise_for_status()は、例外を放出します.
しかし、我々の例ではrのstatus_コードは200ですraiseを呼び出すとfor_status()の場合、次のようになります.
すべてが調和していますね.
レスポンスヘッダ
Python辞書として表示されるサーバ応答ヘッダを表示できます.
しかし、この辞書は特殊です.HTTPの頭のために生まれただけです.RFC 2616によれば、HTTPヘッダは大文字小文字に敏感ではない.
したがって、これらの応答ヘッダフィールドには、任意の大文字でアクセスできます.
応答ヘッダフィールドが存在しない場合は、デフォルト値はNoneです.
Cookies
応答にCookieが含まれている場合は、迅速にアクセスできます.
サーバーにクッキーを送信するには、クッキーパラメータを使用します.
リダイレクトとリクエスト履歴
GETまたはOPTIONSを使用すると、Requestsは位置リダイレクトを自動的に処理します.
GithubはすべてのHTTP要求をHTTPSにリダイレクトする.応答オブジェクトのhistoryメソッドを使用して、リダイレクトを追跡できます.Githubが何をしたか見てみましょう
Response.historyはclass:Requestオブジェクトのリストで、リクエストを完了するために作成されます.このオブジェクトリストは、最も古いリクエストから最近のリクエストに従ってソートされます.
GETまたはOPTIONSを使用している場合はallow_redirectsパラメータはリダイレクト処理を無効にします.
POST、PUT、PATCH、DELETE、HEADを使用している場合は、リダイレクトを有効にすることもできます.
タイムアウト
リクエストstsは、timeoutパラメータで設定された秒数時間が経過した後、待機応答を停止するように伝えることができます.
注意:
timeoutは、応答体のダウンロードに関係なく、接続プロセスにのみ有効です.
エラーと例外
DNSクエリの失敗、接続の拒否などのネットワーク上の問題が発生すると、RequestsはConnectionError例外を放出します.
まれな無効なHTTP応答に遭遇すると、RequestsはHTTPError異常を放出します.
リクエストがタイムアウトした場合、Timeout例外が放出されます.
要求が設定した最大リダイレクト回数を超えると、TooManyRedirects例外が放出されます.
すべてのRequestsが明示的に投げ出す異常はrequestsから継承される.exceptions.RequestException .
変換元:http://blog.csdn.net/iloveyin/article/details/21444613
簡単な例から始めましょう.
リクエストの送信
Requestsを使用してネットワークリクエストを送信するのは簡単です.
最初にRequestsモジュールをインポートするには、次の手順に従います.
>>> import requests
次に、Webページを取得してみます.この例ではGithubの共通タイムラインを取得します
>>> r = requests.get('https://github.com/timeline.json')
今、rというResponseオブジェクトがあります.このオブジェクトから私たちが望むすべての情報を取得できます.
Requestsの簡便なAPIは、すべてのHTTP要求タイプが明らかであることを意味する.例えば、HTTP POSTリクエストを送信することができます.
>>> r = requests.post("http://httpbin.org/post")
きれいですね.では、他のHTTPリクエストタイプ:PUT、DELETE、HEAD、OPTIONSはどうでしょうか.同じように簡単です.
>>> 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のクエリー文字列(query string)にデータを渡したいことが多いかもしれません.手動でURLを構築する場合、データはキー/値ペアの形式でURLに配置され、疑問符の後ろに表示されます.例えばhttpbin.org/get?key=val . Requestsでは、paramsキーワードパラメータを使用して、これらのパラメータを辞書で提供できます.例えば、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パラメータにdictを簡単に渡すだけでいいです.
たとえば、前の例では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フォームによく似たフォームとしてエンコードされたデータを送信します.これを実現するには、dataパラメータに辞書を簡単に渡すだけです.データ辞書は、要求を発行すると自動的にフォーム形式に符号化されます.
>>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.post("http://httpbin.org/post", data=payload) >>> print r.text { ... "form": { "key2": "value2", "key1": "value1" }, ... }
多くの場合、送信したいデータはフォーム形式に符号化されていません.dictではなくstringを渡すと、データは直接公開されます.
例えば、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マルチセクション符号化(Multipart-Encoded)ファイル
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以外の応答)が送信された場合、Responseを介して.raise_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ですraiseを呼び出すと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'
応答ヘッダフィールドが存在しない場合は、デフォルト値はNoneです.
>>> 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'
サーバーにクッキーを送信するには、クッキーパラメータを使用します.
>>> url = 'http://httpbin.org/cookies' >>> cookies = dict(cookies_are='working') >>> r = requests.get(url, cookies=cookies) >>> r.text '{"cookies": {"cookies_are": "working"}}'
リダイレクトとリクエスト履歴
GETまたはOPTIONSを使用すると、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]>]
Response.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]>]
タイムアウト
リクエストstsは、timeoutパラメータで設定された秒数時間が経過した後、待機応答を停止するように伝えることができます.
>>> 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)
注意:
timeoutは、応答体のダウンロードに関係なく、接続プロセスにのみ有効です.
エラーと例外
DNSクエリの失敗、接続の拒否などのネットワーク上の問題が発生すると、RequestsはConnectionError例外を放出します.
まれな無効なHTTP応答に遭遇すると、RequestsはHTTPError異常を放出します.
リクエストがタイムアウトした場合、Timeout例外が放出されます.
要求が設定した最大リダイレクト回数を超えると、TooManyRedirects例外が放出されます.
すべてのRequestsが明示的に投げ出す異常はrequestsから継承される.exceptions.RequestException .
変換元:http://blog.csdn.net/iloveyin/article/details/21444613