python requests advanced usage -- SSL証明書エラーの解決策を含む
<スパン httpsのサイトにアクセスするためにrequestsを使用すると、エラーが発生します。
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
この記事を http://python.codemach.com/pythonrequests-gao-ji-yong-fa.html で探す
---------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------
セッションオブジェクト セッションオブジェクト
Sessionオブジェクトを使用すると、リクエスト時に特定のパラメータを持続させることができます。さらに、すべてのリクエストに対して、Session インスタンスによってクッキーも永続化されます。
を使うことにこだわってみましょう。
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print r.text
# '{"cookies": {"sessioncookie":"123456789"}}'
また、セッションを使用して、データを要求するデフォルトのメソッドを提供することができます。これは、データセッションオブジェクトに以下のプロパティを与えることで実現します。
s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
# 'x-test' と 'x-test2' の両方が送信されます。
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
辞書はすべてセッションレベルで設定された値にマージされ、リクエストメソッドに渡されます。メソッドレベルのパラメータはセッションのパラメータを上書きします。
辞書パラメータから値を取得する
セッションからパラメータを削除したい場合は、パラメータをnoneに設定すれば自動的に削除されます。
セッション内のすべての値が含まれ、直接提供されます。詳しくはSession APIドキュメントをご覧ください。
リクエストオブジェクトとレスポンスオブジェクト
>>> r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
表示
>>> r.headers
{'content-length': '56170', 'x-content-type-options': 'nosniff', 'x-cache':
'HIT from cp1006.eqiad.wmnet, MISS from cp1010.eqiad.wmnet','content-encoding':
'gzip', 'age': '3080', 'content-language': 'en', 'vary': 'Accept-Encoding,Cookie',
'server': 'Apache', 'last-modified': 'Wed, 13 Jun 2012 01:33:50 GMT'。
'connection': 'close', 'cache-control': 'private, s-maxage=0, max-age=0,
must-revalidate', 'date': 'Thu, 14 Jun 2012 12:59:39 GMT', 'content-type':
'text/html; charset=UTF-8', 'x-cache-lookup': 'HIT fromcp1006.eqiad.wmnet:3128,
cp1010.eqiad.wmnet:80 からはMISS'}。
しかし、サーバーが送信したヘッダーを取得したい場合は、単にリクエストにアクセスし、次にリクエストヘッダにアクセスします。
>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip'。
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}.
リクエストの準備
APIコールやセッションコールでResponseオブジェクトを受け取ったとき、requestプロパティは実際にPreparedRequestによって使用されます。場合によっては、リクエストを送信する前に、ボディやヘッダ (あるいは本当に他のもの) に対して何らかの追加作業を行いたいことがあります。この簡単なレシピは次のとおりです。
from requests import Request, Session
s = セッション()
prepped = Request('GET', # または 'POST', 'PUT', などの他のメソッド)
のURLになります。
data=data
headers=headers
# ...
).prepare()
# prepped.bodyで何かをする
# prepped.headersをどうにかしてくれ
resp = s.send(prepped,
stream=stream。
verify=検証する。
proxies=プロキシ。
cert=cert。
timeout=タイムアウト。
# などです。
)
print(resp.status_code)を実行します。
リクエストオブジェクトに対して特別なことはしていないので、PreparedRequestオブジェクトをすぐに修正することができます。それから、送信したいリクエストの他のパラメータを送信することができます。* またはSesssionで *.
SSL証明書の検証
Requests は、Web ブラウザと同様に HTTPS リクエストの SSL 証明書を検証することができます。ホストのSSL証明書を確認するには、checksumパラメータを使用します。
>>> requests.get('https://kennethreitz.com', verify=True)
requests.exceptions.SSLError: ホスト名 'kennethreitz.com' は '*.herokuapp.com', 'herokuapp.com' のいずれとも一致しません。
このドメインにはSSLを設定していないので、失敗しています。Great On Githubはないですが。
>>> requests.get('https://github.com', verify=True)
<レスポンス [200]>
また、プライベート証明書の CA_BUNDLE ファイルのパスを検証することで、確認することができます。また、環境変数REQUESTS_CA_BUNDLEを設定することも可能です。
また、検証の設定をFalseにすると、SSL証明書の検証を無視することができます。
>>> requests.get('https://kennethreitz.com',cert=('/path/server.crt', '/path/key'))を実行します。
<レスポンス [200]>
間違ったパスや無効な証明書が指定された場合。
>>> requests.get('https://kennethreitz.com',cert='/wrong_path/server.pem')を実行します。
SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSLroutines:SSL_CTX_use_PrivateKey_file:PEM lib
メインコンテンツのワークフロー
デフォルトでは、リクエストを行うと、ボディはすぐにダウンロードすることで応答します。この動作をオーバーライドして、streamパラメータのプロパティで、Response.contentにアクセスするまで、レスポンスのボディをダウンロードするのを遅らせることができます。
tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)
この時点ではダウンロードしたレスポンスヘッダとコネクションだけが残っており、コンテンツの取得を条件付きで行うことができるようになっています。
if int(r.headers['content-length']) < TOO_LONG:
コンテンツ = r.content
...
Response.iter_content と Response.iter_lines メソッドを使用してワークフローをさらに制御したり、Response.raw でベースの urllib3.HTTPResponse から読み取ったりすることも可能です。
活動的であること
公開された接続は、読み込まれたすべてのデータを再利用するプールに戻ることに注意してください。
データストリームを false に設定するか、Response オブジェクトの content プロパティを必ず読み込んでください。
ストリームのアップロード
リクエストサポート それは、アップロードのためにメモリに読み込まれない大量のストリームやファイルストリームを送信することができます。ストリームやアップロードを行うには、単純にボディにファイルのようなオブジェクトを
をopen('massive-body')をfとして指定します。
requests.post('http://some.url/streamed', data=f)
ブロックエンコードの要求。
また、リクエストの送信および受信をエンコードするチャンク転送もサポートしてください。チャンクエンコーディングされたリクエストを送るには、BODY: にジェネレータ (または長さのない任意のイテレータ) を指定するだけです。
def gen():
'hi'を返す。
そこにいる
requests.post('http://some.url/chunked', data=gen())
イベントフック。
リクエストにはフックであるsystemがあり、リクエスト処理の一部やシグナルイベントの処理に使用することができます。
フック関数は、フックのリクエストパラメータを {hook_name: callback_function} という辞書で指定し、リクエストごとに指定することができます。
hooks=dict(response=print_url)
そのCALLBACK_FUNCTIONは、受信したデータブロックを第1引数として受け取ります。
>>> requests.get('http://httpbin.org',hooks=dict(response=print_url))を実行します。
http://httpbin.org
<レスポンス [200]>
カスタム認証
このcallback_functionは、最初の引数としてデータのチャンクを受け取ります。
from requests.auth import AuthBase
class PizzaAuth(AuthBase):
与えられたリクエストオブジェクトに HTTP ピザ認証をアタッチします。
def __init__(self, username):
# 認証に関連するあらゆるデータを設定する
self.username = ユーザー名
def __call__(self, r):
# リクエストを修正して返す
r.headers['X-Pizza'] =self.username
return r
次に、Pizza Auth を使ってリクエストを行います。
>>> requests.get('http://pizzabin.org/admin',auth=PizzaAuth('kenneth'))
<レスポンス [200]>
プロキシ
インポートリクエスト
プロキシ = { <未定義
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080"。
}
requests.get("http://example.org", proxies=proxies)
また、プロキシサーバー環境 HTTP_PROXY および HTTPS_PROXY を設定することができます。
$ export HTTP_PROXY="http://10.10.1.10:3128"。
$ export HTTPS_PROXY="http://10.10.1.10:1080"。
$ python
>>> インポート リクエスト
>>> requests.get("http://example.org")。
プロキシでHTTP Basic Authを使用するには、http://user:password@host/syntaxを使用します。
プロキシ = { <未定義
"http":"http://user:[email protected]:3128/" です。
}
<スパン コンプライアンス
ユーザーに困難をもたらすことなく、関連する仕様やRFCに準拠することが要求されています。これには懸念があり、おそらく当該仕様に不慣れな人にとっては、一見異常な動作になる可能性があります。
コーディングです。
明示的な文字セットがない場合、テキストはHTTPヘッダーのContent-Typeヘッダーに含まれます。この場合、RFC2616ではデフォルトの文字セットはISO-8859-1でなければならないと規定されています。
HTTP動詞
リクエストでは、ほぼすべてのHTTP動詞にアクセスすることができます。GET, OPTIONS, HEAD, POST, PUT, PATCH, そして DELETE。詳細な例は、GitHub の API を使ってリクエストの中でこれらのさまざまな動詞を使ったものです。
>>> インポートリクエスト
>>> r =requests.get('https://api.github.com/repos/kennethreitz/requests/git/commits/ a050faf084662f3a352dd1a941f2c7c9f886d4ad')を実行します。
GitHub は JSON を返すので、r.json メソッドでパースして Python オブジェクトに変換します。
>>> commit_data = r.json()
>>> print commit_data.keys()
[u'committer'、u'author'、u'url'、u'tree'、u'sha'、u'parents'、u'message']。
>>> print commit_data[u'committer'].
{u'date': u'2012-05-10T11:10:50-07:00', u'email': u'[email protected]',u'name': u'Kenneth Reitz'}.
>>> print commit_data[u'message'].
履歴を作る
リクエストには、非常に一般的なBasic認証を含む、さまざまな形式の認証を簡単に使用することができます。
>>> from requests.auth import HTTPBasicAuth
>>> auth = HTTPBasicAuth('[email protected]','not_a_real_password')
>>> r = requests.post(url=url, data=body, auth=auth)
>>> r.status_code
201
>>> content = r.json()
>>> print content[u'body'].
すぐに取り掛かります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例