python requestsライブラリ入門〔回転〕

25871 ワード

まず、確認します.
  • Requests
  • がインストールされています.
  • Requestsは最新の
  • です
    簡単な例から始めましょう.
    リクエストの送信
    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