Pythonで利用されるHTTPライブラリのrequestsに関する解説になります。
以下の内容をまとめています。
- requestsモジュールとは何か
- requestsとSeleniumの違い
- requestsのインストール
- requestsの使い方
- requests.get()の引数の使い方
- responseオブジェクトの確認
- SIer/Web系企業での実務経験があるフリーランスエンジニア
- プログラミングスクールでの講師実績あり
- HR領域によるエンジニア特化の採用代行を業務委託で兼務
requestsとは
Pythonのrequestsは、HTTP通信を利用したライブラリです。
HTTPは、クライアントとサーバーの間でデータをやりとりするためのプロトコル(規約)です。
また、HTTPは様々なメソッドを提供しており、以下の代表的なメソッドがあります。
メソッド名 | 説明 |
---|---|
requests.get() | サーバーから情報を取得 |
requests.post() | サーバーへ情報を送信 |
requests.put() | サーバーの情報を更新 |
requests.delete() | サーバーの情報を削除 |
requestsは、特にWebスクレイピングに利用されたり、WebAPI連携によるデータ取得などに利用されます。
requestsとSeleniumの違い
requestsとSeleniumの違いは、ブラウザ操作・制御の有無になります。
requestsは、Seleniumと違ってブラウザ操作を実施しないため、URLをもとにサイト情報を取得します。
また、サイト情報をHTMLあるいはXMLなどのデータで取得するため、取得後はBeautifulSoupといった解析用ライブラリを利用する必要があります。
Seleniumにおける各メソッドの使い方を詳細に知りたい人は、「【Python】 Seleniumとは?インストールから使い方まで徹底解説!」を一読ください。
requestsのインストール
requestsはサードパーティライブラリであるため、別途インストールが必要になります。
.pyファイルにコードを記述する前にrequestsをインストールしておきましょう。
pip install requests
Macならターミナル、Windowsであればコマンドプロンプトで実施後、Successfullyが表示されたら完了です。
requestsのメソッドの使い方
改めて、代表的なrequestsのメソッドは以下の4つです。
メソッド名 | 説明 |
---|---|
requests.get() | サーバーから情報を取得 |
requests.post() | サーバーへ情報を送信 |
requests.put() | サーバーの情報を更新 |
requests.delete() | サーバーの情報を削除 |
本記事では、Webスクレイピングを利用するため、.get()メソッドを重点的に解説します。
ログインが必要なケースで.session()メソッドを利用する場合があるため、ログイン処理を含めた解説は後述します。
requests.get()の引数の使い方
Webスクレイピングといったデータ収集などで頻繁に利用されるのがrequests.get()になります。
res = requests.get(URL, 任意の引数)
.get()メソッドを利用することで直感的に操作することができます。
また、以下が主な引数になります。
メソッド名 | 必須/任意 | 説明 |
---|---|---|
URL | 必須 | 対象URL |
headers | 任意 | リクエスト時にヘッダーデータを辞書で指定 |
params | 任意 | リクエスト時にURLのクエリパラメータを辞書で指定 |
cookies | 任意 | リクエスト時にクッキーを辞書で指定 |
timeout | 任意 | リクエスト時のタイムアウトを指定 |
スクレイピング業務では、引数にURLのみを利用することが多いです。
requests.get()によるresponseオブジェクトの確認
リクエスト後の戻り値(応答)として、responseオブジェクトが返ってきます。
以下がresponseオブジェクトの属性値になります。
属性 | 説明 |
---|---|
status_code | ステータスコード |
headers | レスポンスヘッダーのデータ |
content | レスポンスのバイナリデータ |
text | レスポンスのテキストデータ |
encoding | エンコーディング(変換方式:utf-8など) |
cookies | クッキーデータ |
ここでは、以下の条件でresponseオブジェクトがどのようなデータを返すか確認します。
引数 | データ |
---|---|
URL | https://google.co.jp/ |
params | {‘q’:’Python’} |
上記の引数をrequests.get()メソッドに渡します。
import requests
url = 'https://google.co.jp'
params = {'q':'Python'}
response = requests.get(url, params=params)
responseオブジェクトの各属性を確認します。
レスポンスデータの解析を理解したい人は、「【Python】 BeautifulSoup4とは?インストールから使い方まで徹底解説!」を一読ください。
status_code(ステータスコード)
HTTPステータスコードは、サーバー側からのレスポンスの状況を確認するコードになります。
3桁が連なったコードであり、何番台かによって状況が異なります。
ステータスコードを理解することで、エラー処理などに役立ちます。
ステータスコード | 範囲 | 説明 |
---|---|---|
100~ | 100~199 | Informational:リクエストは受信されて処理が継続する |
200~ | 200~299 | Success:リクエストが成功している |
300~ | 300~399 | Redirection :リダイレクトや遷移などリクエスト完了に追加処理が必要になる |
400~ | 400~499 | Client Error:クライアントからのリクエストに誤りがある |
500~ | 500~599 | Server Error :サーバ側でリクエスト処理に失敗する |
print(response.status_code)
200
ここでは、ステータスコード200ということでリクエスト成功が表示されています。
headers(レスポンスヘッダー)
TTPレスポンスヘッダーは、サーバー側からのレスポンスのヘッダー部分になります。
#print(response.headers)
#分かりやすいように各要素のキー・値を表示します。
for key,value in response.headers.items():
print(key,' || ',value)
Date || Sun, 09 Jul 2023 09:38:27 GMT
Expires || -1
Cache-Control || private, max-age=0
Content-Type || text/html; charset=Shift_JIS
Content-Security-Policy-Report-Only || object-src 'none';base-uri 'self';script-src 'nonce-7SrrK0Im7SpdUnC2WbJcDg' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
P3P || CP="This is not a P3P policy! See g.co/p3phelp for more info."
Content-Encoding || gzip
Server || gws
X-XSS-Protection || 0
X-Frame-Options || SAMEORIGIN
Set-Cookie || 1P_JAR=2023-07-09-09; expires=Tue, 08-Aug-2023 09:38:27 GMT; path=/; domain=.google.co.jp; Secure, AEC=Ad49MVGlNWxOpzsuP1dxXBzyDc-XJ7sKN_seRn36DnWou5-eb3O9PzDS5A; expires=Fri, 05-Jan-2024 09:38:27 GMT; path=/; domain=.google.co.jp; Secure; HttpOnly; SameSite=lax, NID=511=FFsw48vTUH07Ww7lAC4LH0VtPBz6ooMAIdWdaikOyuzxHpfsfxc2HV-t9RU4mqfBLYVw8oQIPARM-UdR4ca88oETTZBxKdielU8UY2aMEWxnwC-A3StOG0zovHrIlpu0aMJ8ToLLX8EQtIxNd9BgKkCSDiyfikeWF6FNDOPpLKM; expires=Mon, 08-Jan-2024 09:38:27 GMT; path=/; domain=.google.co.jp; HttpOnly
Alt-Svc || h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
Transfer-Encoding || chunked
レスポンスヘッダーのデータは、取得するデータのオプションが記載されています。
content(レスポンスのバイナリデータ)
バイナリデータとは、PCが扱えるデータを指します。
そのため、人間では判断できないデータが含まれています。
print(response.content[:500])
b'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="\x90\xa2\x8aE\x92\x86\x82\xcc\x82\xa0\x82\xe7\x82\xe4\x82\xe9\x8f\xee\x95\xf1\x82\xf0\x8c\x9f\x8d\xf5\x82\xb7\x82\xe9\x82\xbd\x82\xdf\x82\xcc\x83c\x81[\x83\x8b\x82\xf0\x92\xf1\x8b\x9f\x82\xb5\x82\xc4\x82\xa2\x82\xdc\x82\xb7\x81B\x82\xb3\x82\xdc\x82\xb4\x82\xdc\x82\xc8\x8c\x9f\x8d\xf5\x8b@\x94\\\x82\xf0\x8a\x88\x97p\x82\xb5\x82\xc4\x81A\x82\xa8\x92T\x82\xb5\x82\xcc\x8f\xee\x95\xf1\x82\xf0\x8c\xa9\x82\xc2\x82\xaf\x82\xc4\x82\xad\x82\xbe\x82\xb3\x82\xa2\x81B" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="7SrrK0Im7SpdUnC2WbJcDg'
上記のコードは、レスポンスのバイナリデータから500文字までを表示しています。
text(レスポンスのテキストデータ)
responseオブジェクトに含まれるバイナリデータをヘッダーのエンコーディングでデコード(復元)することで、テキストデータに変換されます。
そのため、テキスト属性を利用して中身を確認します。
print(response.text[:500])
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="7SrrK0Im7SpdUnC2WbJcDg">(function(){var _g={kEI:'E4CqZNzaDuLF9APn2ruwBA',kEXPI:'0,1
バイナリデータと比較すると、日本語の文字列に変換されていることが分かります。
encoding(エンコーディング)
バイナリデータは、そのままで人間が扱えるデータになりません。
responseオブジェクトに含まれるバイナリデータをヘッダーのエンコーディングでデコード(復元)することで、テキストデータに変換します。
print(response.encoding)
Shift_JIS
表示結果から、’Shift_JIS’を利用していることが分かります。
cookies(レスポンスのクッキーデータ)
クッキーデータ(cookies)とは、対象URL(Webサイト)を保持するサーバー側から送信される情報で、端末(PC, スマホ)に保存されます(アクセス履歴)。
print(response.cookies)
<RequestsCookieJar[<Cookie 1P_JAR=2023-07-09-09 for .google.co.jp/>, <Cookie AEC=Ad49MVGlNWxOpzsuP1dxXBzyDc-XJ7sKN_seRn36DnWou5-eb3O9PzDS5A for .google.co.jp/>, <Cookie NID=511=FFsw48vTUH07Ww7lAC4LH0VtPBz6ooMAIdWdaikOyuzxHpfsfxc2HV-t9RU4mqfBLYVw8oQIPARM-UdR4ca88oETTZBxKdielU8UY2aMEWxnwC-A3StOG0zovHrIlpu0aMJ8ToLLX8EQtIxNd9BgKkCSDiyfikeWF6FNDOPpLKM for .google.co.jp/>]>
クッキーデータの中身は、アカウント情報・サイト訪問数や日時など様々な情報が記録されています。
requstsにおける.session()メソッドのログイン処理
ログインを必要とするWebサイトにてrequestsライブラリを利用する際に、都度GET/POSTのアクセス時にセッション切れで毎回ログイン処理を要求されるケースがあります。
セッション切れを回避するため、requestsライブラリは.session()メソッドが存在します。
import requests
username = "{ユーザーネーム}"
password = "{パスワード}"
login_url = "{対象サイトのログインページ}"
# セッションのインスタンス作成
session = requests.Session()
response = session.post(
url=login_url,
data={
"username": username,
"password": password,
}
)
print(response.text)
# ログイン後に表示されるHTMLデータ取得
Sessionオブジェクトを使用すると、リクエスト間で特定のパラメータを永続化することでセッション切れを回避します。
ログイン処理ができない時の対処
対象サイトによっては、セッションなしのログイン処理によりセッション切れが発生するケースがあります。
理由は、対象サイト側でこちらが予期していないセキュリティ対策を講じている可能性があります。
- ユーザーエージェントの問題
- ログイン画面の表示時点でCookie発行して整合性が取れない
- トークン情報の付与が求められる
上記のようなケースでログイン処理が実行できない、あるいはセッション切れが発生する場合にセッションインスタンスを作成し、ログイン画面をGETしてCookieやトークン情報を得ておく必要があるでしょう。
本格的にエンジニアへのキャリアチェンジを考えてる人へ
プログラミングスキルを社内やプライベートで活用している人が増えています。
- 一部業務プロセスの効率化/自動化
- 分析システム構築による担当業務改善
- 社内公開によるチーム/プロジェクトの業務時間短縮
Pythonは特にデータ収集や分析に特化したライブラリが豊富なため、業務プロセスの一元管理やDX化に貢献しています。
また、プログラミングに触れてエンジニアへのキャリアチェンジを実現したい人の人材規模も年々高まっています。
一度、あなたのキャリアプランを振り返ってみてください。
- 収入アップが見込めている
- キャリアアップが見込めている
- 働き方を明確に決めれている
上記の項目をYESと答えられる人は、特に言うことはありません。
現在、エンジニアへのキャリアチェンジでお悩みの方は、「【Python特化】厳選したおすすめプログラミングスクール」を一読ください。
コメント