02. Requests

図解!PythonのRequestsを徹底解説!(インストール・使い方)

更新日:

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

Requestsとは

requestsとは、HTTP通信用のPythonのライブラリです。主にWEBスクレイピングでHTMLやXMLファイルからデータを取得するのに使われます。

 
インターネット上に公開されているWEBサイトでは広くHTMLやXMLが使われており、これらの情報の取得に大変便利なライブラリです。

 
スクレイピングは、大まかに3つのステップに分けることができます。
 

1つ目はWEBサイトのHTMLなどのデータ取得です。ただし、HTMLには必要な文章のデータだけでなく、タグなどのデータも混じっているので、必要なものだけを抽出する作業が必要になります。
 
そこで2つ目のデータの抽出が欠かせません。ここでは、複雑な構造のHTMLデータを解析し、必要な情報だけを抽出します。
 
そして最後に抽出した情報をデータベースやファイルなどに保存します。
 
このWEBスクレイピングの3ステップの中で、requestsは1つ目のHTMLデータの取得によく用いられます。Pythonではrequestsを利用して、簡単にWEBサイトからデータを自動的に取得することができます。

 
その後、取得したデータからBeautiful Soupなどの別のライブラリを用いて必要な情報のみを抽出します。Beautiful Soupの詳しい説明は、「図解!Beautiful SoupでWEBスクレイピング徹底解説!」を参照ください。

 
ここではまず、requestsというライブラリの基本となる使い方を確認していきましょう。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

Requestsのインストール(pip・conda)

Requestsは、標準ではインストールされていませんので、pipやcondaを利用して別途インストールする必要があります。

 
requests をpipでインストールする場合は、次のコマンドを入力してください。

pip install requests

pipの詳しい説明は「Pythonでの外部ライブラリの追加インストール方法」を参照ください。

 
またcondaでインストールする場合は、次のコマンドを入力してください。

conda install requests

condaの詳しい説明は「Anacondaでの外部ライブラリの追加インストール方法」を参照ください。

 
これでインストールは終わりました。次に、これらのライブラリを利用する前にはインポートしておく必要があります。

 
以上で、Requestsを使うための準備は終わりです。

 
 

Requestsの基本的な使い方

これからrequestsの基本となる使い方を紹介していきます。

requestsで主に使われるメソッドには、次のようなものがあります。

メソッド説明
get()サーバから情報を取得するのに使用する。
post()サーバへ情報を登録する時に使用する。
put()サーバの情報を更新する時に使用する。
delete()サーバの情報を削除する時に使用する。

この中でも、WEBスクレイピングに使われるget()をまず紹介していきます。

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が新発売!今なら期間限定で89%オフ!!!

requests.get()の使い方

get()は、サーバからHTML、XMLなどの情報を取得するのに使用します。

 
requests.get()の記述方法は以下です。

response = requests.get(URL, その他任意の引数)

主な引数は、

引数必須/任意説明
URL必須読み込み対象のURL
headers任意ヘッダとして送信する内容を辞書で指定
timeout任意リクエストのタイムアウト時間
params任意URLのクエリパラメータを辞書で指定
cookies任意クッキーとして送信する内容を辞書で指定

 
戻り値としてresponseオブジェクトが返ってきます。responseオブジェクトには様々な属性値があり、主なものは次になります。

属性説明
status_codeステータスコード
headersレスポンスヘッダの内容
contentレスポンスのバイナリデータ
textレスポンスの内容
encodingエンコーディング
cookiesクッキーの内容

※引数、responseオブジェクトの属性の詳細については、後で詳しく解説します。

 
 
ここではget()の使い方の例として、yahoo news のページを取得してみましょう。

 
requests.get()を利用して、yahoo newsサイトの情報をダウンロードします。変数urlを定義し、確認したいWEBサイトのアドレスを渡します。

 
次に、requests.get()に対してurlを渡しています。request.get()で指定されたwebの情報を取得し、その結果は、変数responseに格納します。

 
 
試しに取得した内容を表示してみましょう。textで内容を確認することができます。ここでは最初の500文字だけを表示しています。

取得したHTMLのコードが表示されました。この中にはtitle「Yahoo!ニュース」なども含まれています。

 
 
また取得した全ての内容を表示するとわかりますが、主要ニュースのタイトルなど、画面に表示されている内容も取得できていることがわかります。


※一部抜粋

このようにWEBサイトの大量の情報が取り込まれています。

 
 
これら取得したデータの中から、ニュースのタイトルやURLなどの必要な情報を取得するのは、次のステップ2のデータの抽出になります。
 

データの抽出については、「図解!Beautiful SoupでWEBスクレイピング徹底解説!」をご確認ください。

 
 

Responseオブジェクト

ここでは、requests.get()の戻り値であるresponseオブジェクトの内容を詳しく確認していきましょう。

 
その前にHTTP通信の流れを確認しておきます。

最初にrequests.get()でサーバにリクエスト(あるURLのページを取得したいなど)を送信します。
 
そしてサーバで処理が行われ、サーバからレスポンスが返ってきます。その中にはステータスライン、ヘッダ、ボディが含まれます。これらの内容はresponseオブジェクトの属性で確認することができます。

 
 
先ほどyahoo newsサイトに対して実行したget()の戻り値を元に、responseオブジェクトの属性を確認していきます。

 

ステータスコード(status_code)

HTTPステータスコードは、HTTP通信においてWebサーバからのレスポンスの状況を示すコードになります。レスポンスのステータスラインの中に含まれます。

 
3桁のコードからなり、何番台かによって意味合いが異なってきます。

ステータスコード範囲説明
100番台100-199Informational:リクエストは受け取られ、処理が継続。
200番台200-299Success:リクエストに成功。
300番台300-399Redirection :リダイレクトや移行など、リクエストの完了には追加的な処理が必要。
400番台400-499Client Error:クライアントからのリクエストに誤りあり。
500番台500-599Server Error :サーバ側でリクエストの処理に失敗。

400番台と500番台がエラーコードになります。

 
 
先ほどのresponseのステータスコードを表示してみます。

200

ここではリクエストの成功を表すコード200が表示されました。

 
 

レスポンスヘッダ(headers)

HTTPレスポンスヘッダは、HTTP通信においてWebサーバからのレスポンスのヘッダ部分になります。

 
レスポンスヘッダの内容を表示してみます。

{'Cache-Control': 'private, no-cache, no-store, must-revalidate', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=UTF-8', 'Date': 'Mon, 30 Dec 2019 00:47:30 GMT', 'Set-Cookie': 'B=2cf6nhhf0ii92&b=3&s=g7; expires=Thu, 30-Dec-2021 00:47:30 GMT; path=/; domain=.yahoo.co.jp, XB=2cf6nhhf0ii92&b=3&s=g7; expires=Thu, 30-Dec-2021 00:47:30 GMT; path=/; domain=.yahoo.co.jp; secure; samesite=none', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'X-Download-Options': 'noopen', 'X-Frame-Options': 'DENY', 'X-Vcap-Request-Id': '74c556c6-726b-42c4-5eeb-c0a009486b0c', 'X-Xss-Protection': '1; mode=block', 'Age': '0', 'Server': 'ATS', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Via': 'http/1.1 edge1554.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])'}

辞書で各要素のキーと値が表示されました。

 
 
辞書をそのまま表示するとわかりづらいので、各要素のキーと値をペアに改行して表示してみます。

Cache-Control     private, no-cache, no-store, must-revalidate
Content-Encoding     gzip
Content-Type     text/html;charset=UTF-8
Date     Mon, 30 Dec 2019 00:47:30 GMT
Set-Cookie     B=2cf6nhhf0ii92&b=3&s=g7; expires=Thu, 30-Dec-2021 00:47:30 GMT; path=/; domain=.yahoo.co.jp, XB=2cf6nhhf0ii92&b=3&s=g7; expires=Thu, 30-Dec-2021 00:47:30 GMT; path=/; domain=.yahoo.co.jp; secure; samesite=none
Vary     Accept-Encoding
X-Content-Type-Options     nosniff
X-Download-Options     noopen
X-Frame-Options     DENY
X-Vcap-Request-Id     74c556c6-726b-42c4-5eeb-c0a009486b0c
X-Xss-Protection     1; mode=block
Age     0
Server     ATS
Transfer-Encoding     chunked
Connection     keep-alive
Via     http/1.1 edge1554.img.bbt.yahoo.co.jp (ApacheTrafficServer [c sSf ])

レスポンスヘッダのキー毎の値が確認しやすくなりました。

 
 

エンコーディング(encoding)

レスポンスヘッダの中の項目にエンコーディングがあります。

 
レスポンスボディにはバイナリデータがありますが、バイナリデータは、テキスト以外のコンピュータで扱えるデータで、人間が見て理解できるものではありません。

 
バイナリデータをこのエンコーディングでデコード(復元)し、人間が確認できるようにしたものがテキストデータになります。

 
先ほどのresponseのエンコーディングを表示してみます。

'UTF-8'

UTF-8が表示されました。

 
 

レスポンスのバイナリデータ(content)

この属性により、レスポンスボディに含まれるバイナリデータを確認することができます。

 
画像などはバイナリデータをそのまま利用しますが、テキストの情報は人間が理解できるようデコード(復元)している属性textを使って確認します。

 
先ほどのresponseのバイナリデータを表示します。最初の500文字だけを表示します。

バイナリデータは、テキスト以外のコンピュータで扱えるデータなので、人間が見て理解できない文字が並んでいます。

 
 

レスポンスのテキストデータ(text)

レスポンスボディに含まれるバイナリデータを、ヘッダのエンコーディングでデコード(復元) し、人間が確認できるようにしたものがテキストデータになります。

 
テキスト情報は、この属性の内容で確認することができます。

 
responseの属性textの内容を表示してみましょう。ここでも最初の500文字だけを表示しています。

取得したHTMLのコードが表示されました。この中にはタイトルなどで日本語も含まれています。

 
 

レスポンスのクッキー(cookies)

クッキー(cookie)とは、参照しているWebサイトから送られて来る情報で、端末の中に保存されます。その中にはサイトを訪れた日時や、訪問回数など、さまざまな情報が記録されています。

 
この属性では、レスポンスに含まれるクッキーの内容を確認することができます。

 
responseの属性cookiesの内容を表示してみましょう。

レスポンスに含まれているクッキーの内容が表示されました。

 
 

requests.get()の引数

次にrequests.get()の引数の内容を詳しく見ていきましょう。

 

ヘッダ(headers)

リクエストにHTTPヘッダを追加することができます。その際にはheadersパラメータに辞書を渡します。

 
辞書のキーとなるリクエストヘッダの項目はたくさんありますが、その中でよく使うのがUser-Agentです。User-Agentにはアプリケーション名、バージョン、ホストオペレーティングシステムなどの情報が格納されています。

 
WEBサイトでは、ボットなどのコンピュータによるアクセスと人間によるアクセスはすぐに判別することができます。

これにより、アクセスを禁止するなどレスポンスが変わるサイトもあります。その判別に使われるのが、User-Agentになります。

 
スクレイピングをする際、User-Agentを設定するのに便利なのが、fake-useragentになります。fake-useragentを利用することにより、人間がアクセスしているのと変わらないUser-Agentの値を自動的に設定することができます。

 
fake-useragentのインストールは、次のコマンドを入力してください。

pip install fake-useragent

 
最初にインポートします。

 
UserAgent()のインスタンスuaを作成し、ua.chromeにてUser-Agentへの設定値を確認できます。ブラウザchromeでアクセスしているのと同様の設定値になります。

'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'

 
次にua.ieにて、ブラウザIEでアクセスしているのと同様のUser-Agentを表示します。

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8'

先ほどと表示されている内容が変わりました。

 
実際にリクエストヘッダのUser-Agentに設定する方法は次のようになります。ヘッダへ設定したい項目'user-agent'の設定値ua.chromeを辞書で定義します。そしてget()の引数headersに渡します。

 
 

タイムアウト(timeout)

リクエストの際、タイムアウトの時間(秒)を設定することができます。いつまでもレスポンスを待ち続けるのではなく、この時間が過ぎるとタイムアウトとして処理が終了します。

 
例えば、タイムアウト3秒を指定する方法は次のように記述します。get()の引数timeoutに秒数を渡します。

 
 

クエリパラメータ(params)

クエリパラメータとは、サーバに情報を送るためにURLの末尾につけ足す文字列のことです。

 
例えば、googleで「python」と検索すると、

次のようなURLが表示されます。「https://www.google.co.jp/search?ei=j9cKXvapMMyRr7wP4t2FGA&q=python…以降、省略」。
 
この場合「?ei=j9cKXvap…」の箇所がクエリパラメータになります。ここでは、クエリパラメータで検索条件が指定されています。

 
この中の「q=python」の箇所で検索条件「python」を指定していますので、「https://www.google.co.jp/search?q=python」で検索しても、先ほどと同様の結果が得られます。

 
リクエストの際にクエリパラメータを指定するには、get()の引数paramを用います。引数paramには、辞書で値を渡します。

 
 
先ほどと同様、googleに対して検索条件「python」を入力した結果を、今度はrequestsを使って取得しましょう。

 
get()に対してURL'https://www.google.co.jp/search'とparamsに辞書で{'q': 'python'}を渡します。そして返ってきたresponseオブジェクトのテキスト属性を表示します。


省略

すると結果として大量のHTMLが表示されました。

 
その中には、先ほどブラウザで検索して1番目に表示されていたページのタイトル「プログラミング言語 Python」と、説明文「プログラミング言語 Pythonの概要を紹介します。」も含まれています。

 
 

関連記事です。
Pythonを使ったスクレイピングについての詳細は、こちらをご覧ください。

 
 






まとめ記事

1

Python3におけるWEBスクレイピングのやり方について初心者向けに解説した記事です。   Requests、Beautiful Soup、Selenium、Pandas、newspape ...

2

Pythonの基本的なトピックについて、チュートリアル形式で初心者向けに解説した記事です。プログラミング未経験者や初心者でもわかりやすいよう、丁寧に解説しています。   Pythonでデータ ...

3

Pandas(パンダス)とは、データを効率的に扱うために開発されたPythonのライブラリの1つで、データの取り込みや加工・集計、分析処理に利用します。   Pandasには2つの主要なデー ...

4

データ分析、機械学習、ディープラーニングにはグラフの描画による可視化は不可欠です。データは、加工前の状態ではただの数字の羅列でしかなく、一目で必要な情報が伝わるものではありません。それを集計しグラフに ...

5

NumPy(ナンパイ)は、数値計算を効率的に行うための拡張ライブラリです。ベクトルや行列などを効率的に数値計算するための数学関数ライブラリを提供します。NumPyを使うことにより、数値計算をより早く、 ...

-02. Requests

Copyright© AI-interのPython3入門 , 2020 All Rights Reserved.