python requestライブラリ

9110 ワード

Requestsモジュールはネットワークアクセス用のモジュールですが、urllib、urllib 2、httplib、httplib 2など、似たようなモジュールがたくさんあります.彼らは基本的に似たような機能を提供していますが、なぜRequestsモジュールが引き出されるのでしょうか.公式サイトを開いて見ると、「人間」が使っているhttpモジュールです.では、いったいどんな人間化なのでしょうか.urllibなどのモジュールを使ったことがあると、比較すると確かに人間的だと思います.
一、導入
ダウンロードが完了すると、インポートモジュールは簡単です.コードは以下の通りです.
import requests

二、urlを要求する
ここでは、getリクエストまたはpostリクエストを送信する最も一般的な構文を示します.
1.パラメータなしgetリクエストを送信する:
r=requests.get("http://pythontab.com/justTest")

今、応答オブジェクトrが得られ、このオブジェクトを利用して私たちが望んでいる情報を得ることができます.
上記の例ではgetリクエストにはパラメータがありませんが、リクエストにパラメータが必要な場合はどうしますか?
 
2.パラメータ付きgetリクエストの送信
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://pythontab.com/justTest", params=payload)

以上より,我々のgetパラメータはparamsキーワードパラメータで伝達されていることが分かった.
リクエストの具体的なurlを印刷して、正しいかどうかを確認できます.
>>>print r.url
http://pythontab.com/justTest?key2=value2&key1=value1

確かに正しいurlにアクセスしていることがわかります.
要求パラメータにリストを渡すこともできます.
>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> r = requests.get("http://pythontab.com/justTest", params=payload)
>>> print r.url
http://pythontab.com/justTest?key1=value1&key2=value2&key2=value3

以上がgetリクエストの基本形式です.
 
3.postリクエストの送信
r = requests.post("http://pythontab.com/postTest", data = {"key":"value"})

以上よりpostリクエストパラメータはdataキーワードパラメータで伝達されることが分かった.
現在のdataパラメータは辞書で、json形式のデータも次のように渡すことができます.
>>> import json
>>> import requests
>>> payload = {"key":"value"}
>>> r = requests.post("http://pythontab.com/postTest", data = json.dumps(payload))

jsonフォーマットデータの送信は一般的すぎるため、Requestsモジュールの高バージョンでは、jsonというキーワードパラメータが追加され、jsonモジュールを使用せずにpostリクエストにjsonデータを直接送信することができます.以下を参照してください.
>>> payload = {"key":"value"}
>>> r = requests.post("http://pythontab.com/postTest", json=payload)

ファイルをpostしたい場合はどうすればいいですか?このときfilesパラメータを使用する必要があります.
>>> url = 'http://pythontab.com/postTest'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)
>>> r.text

postファイルの場合、ファイル名などの追加情報を指定することもできます.
>>> url = 'http://pythontab.com/postTest'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)

tips:テキストファイル形式で開くと、Content-Longthというヘッダでエラーが発生する可能性があるため、バイナリモードでファイルを開くことを強くお勧めします.
 
Requestsを使用してリクエストを送信するのは簡単でしょう.
三、返却情報の取得
次に、リクエストを送信した後、戻り情報を取得する方法について説明します.最上位の例を引き続き使用します.
>>> import requests
>>> r=requests.get('http://pythontab.com/justTest')
>>> r.text

r.textはどんな符号化形式で出力されますか?
>>> r.encoding
'utf-8'

utf-8形式で出力されていましたが、r.textの出力フォーマットを変更したい場合は?
>>> r.encoding = 'ISO-8859-1'

これで出力フォーマットを「ISO-8859-1」に変更しました.
r.contentという出力文もありますが、これはr.textとどのような違いがありますか.r.contentはバイトストリームを返します.画像アドレスを要求し、画像を保存する場合は、次のように使用できます.
def saveImage( imgUrl,imgName ="default.jpg" ):
    r = requests.get(imgUrl, stream=True)
    image = r.content
    destDir="D:\"
    print("    "+destDir+imgName+"
")     try:         with open(destDir+imgName ,"wb") as jpg:             jpg.write(image)                  return     except IOError:         print("IO Error")         return     finally:         jpg.close

さっき紹介したr.textは文字列を返していますが、リクエストに対応する応答がjsonであれば、json形式のデータを直接手に入れることができますか?r.json()はこれのために用意されています.
サーバから返された元のデータも入手できます.r.raw.read()を使用すればいいです.ただし、元の戻りデータを入手する場合は、リクエスト時に「stream=True」のオプションを追加することを覚えておいてください.
r = requests.get('https://api.github.com/events', stream=True)。

応答ステータスコードも入手できます.
>>> r = requests.get('http://pythontab.com/justTest')
>>> r.status_code
200

requests.codes.okを使用して、200という戻り値を指すこともできます.
>>> r.status_code == requests.codes.ok
True

四、headersについて
応答ヘッダを印刷できます.
>>> r= requests.get("http://pythontab.com/justTest")
>>> r.headers

「r.headers」は、次のような辞書を返します.
{
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '147ms',
    'etag': '"e1ca502697e5c9317743dc078f67693a"',
    'content-type': 'application/json'
}

一部の応答ヘッダを取得して判断するには、次の方法を使用します.
r.headers['Content-Type']

または
r.headers.get('Content-Type')

リクエストヘッダ(つまりサーバに送信されたヘッダ情報)を取得したい場合はどうすればいいですか?r.request.headersを使用して直接取得できます.
また、データを要求するときにカスタムheaders(headersキーワードパラメータで渡す)を追加することもできます.
>>> headers = {'user-agent': 'myagent'}
>>> r= requests.get("http://pythontab.com/justTest",headers=headers)

五、Cookiesについて
応答にcookiesが含まれている場合は、次の方法を使用してそれらを得ることができます.
>>> url = 'http://www.pythontab.com'
>>> r = requests.get(url)
>>> r.cookies['example_cookie_name']
'example_cookie_value'

独自のクッキーを送信することもできます(cookiesキーワードパラメータを使用します):
>>> url = 'http://pythontab.com/cookies'
>>> cookies={'cookies_are':'working'}
>>> r = requests.get(url, cookies=cookies)

六、リダイレクトについて
urlを要求すると、githubがhttpリクエストをhttpリクエストにリダイレクトするなど、サーバが自動的にリクエストをリダイレクトします.r.historyを使用してリダイレクトを表示できます.
>>> r = requests.get('http://pythontab.com/')
>>> r.url
'http://pythontab.com/'
>>> r.history
[]

上記の例から、httpプロトコルを使用してアクセスした結果、r.urlで印刷されたのはhttpsプロトコルであることがわかります.では、サーバにhttpプロトコルを使用しなければならない場合、つまりサーバの自動リダイレクトを禁止する場合は、どうすればいいですか?allow_redirectsパラメータを使用します.
r = requests.get('http://pythontab.com', allow_redirects=False)

七、請求時間について
timeoutパラメータを使用してurlのリクエストタイムアウト時間(時間単位秒)を設定できます.
requests.get('http://pythontab.com', timeout=1)

八、代理について
プログラムでプロキシを指定してhttpまたはhttpsアクセスを行うこともできます(proxiesキーワードパラメータを使用します).以下のようにします.
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get("http://pythontab.com", proxies=proxies)

九、セッションについて
私たちは時々このような状況があります.私たちはあるサイトにログインしてからurlを要求する必要があります.この場合、sessionを使用することができます.私たちはまずサイトのログインapiを使用してログインして、sessionを得ることができます.最後に、このsessionを使用してurlを要求することができます.
s=requests.Session()
login_data={'form_email':'[email protected]','form_password':'yourpassword'}
s.post("http://pythontab.com/testLogin",login_data)
r = s.get('http://pythontab.com/notification/')
print r.text

ここで、form_emailおよびform_passwordは、豆弁登録ボックスの対応する要素のname値である.
 
十、ダウンロードページ
Requestsモジュールを使用してWebページをダウンロードすることもできます.コードは次のとおりです.
r=requests.get("http://www.pythontab.com")
with open("haha.html","wb") as html:
    html.write(r.content)
html.close()