Python

【Python】外部パッケージの利用(Web情報の取得:requests)

外部パッケージの利用(Web情報の取得:requests)Python

前回の記事でPythonの外部パッケージの説明と実際に外部パッケージをインストールする方法としてpipコマンドについて説明しました。

今回からは外部パッケージ(外部ライブラリ)としてよく使うものをいくつか紹介していきたいと思います。

今回はWeb情報を取得する際によく使う「requests」という外部パッケージについて、その内容と使い方などを説明していきたいと思います。

この記事を読んで分かること
  • 外部パッケージについての内容がわかる
  • requestsパッケージについて、その内容と具体的な使い方が分かる
スポンサーリンク

RequestsとWebアクセス

Webアクセスって、インターネット上の情報を取得することですよね

そうそう、ホームページなどのWebサイトにプログラムからアクセスするといった時に使う機能です。

例えばWebサイトにアクセスし、そこにあるドキュメントなどの情報を取得するのはネットワークを利用したプログラムを作成する場合は必須の機能です。

ただPythonには、標準でurllibという標準モジュールが用意されているのですが、これが正直いうと、あまり使い勝手が良くないです。

そこで、Webへのアクセスをより簡単に行えるようにしてくれるのが「Requests」という外部パッケージです。

これを利用することで非常に簡単な操作でWebページの情報を取得することが出来ます。

なのでPythonでWebアクセスには、ほぼ外部パッケージの「requests」が使われます

Requestsパッケージのインストール

では、「requests」パッケージをインストールしてみましょう。

インストールは前回説明した「pip」コマンドを使ってインストールします。

ターミナルを起動して、以下のコマンドを実行すると最新のバージョンがインストールされます。

pip install requests

メモ

お使いのPython実行環境によっては、上記pipコマンドでエラーがでる場合がありますので、その場合はpipコマンド前に上記「python -m」または「python3 -m」をつけるように読み替えて下さい。

ちなみに、筆者の環境でインストールを実行すると以下の表示がされました。

$ pip install requests
Collecting requests
  Downloading requests-2.27.1-py2.py3-none-any.whl (63 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.1/63.1 KB 6.7 MB/s eta 0:00:00
Collecting idna<4,>=2.5
  Downloading idna-3.3-py3-none-any.whl (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 KB 6.2 MB/s eta 0:00:00
Collecting charset-normalizer~=2.0.0
  Downloading charset_normalizer-2.0.12-py3-none-any.whl (39 kB)
Collecting certifi>=2017.4.17
  Downloading certifi-2021.10.8-py2.py3-none-any.whl (149 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 149.2/149.2 KB 12.7 MB/s eta 0:00:00
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.9-py2.py3-none-any.whl (138 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 139.0/139.0 KB 12.4 MB/s eta 0:00:00
Installing collected packages: certifi, urllib3, idna, charset-normalizer, requests
Successfully installed certifi-2021.10.8 charset-normalizer-2.0.12 idna-3.3 requests-2.27.1 urllib3-1.26.9

最終行に「Successfully installed」もしくは「Requirement already satisfied」と表示されていれば、requestsのインストールが正しく行われています

Requestsパッケージのアクセス関数

Requestsパッケージには、Webサイトにアクセス(HTTPリクエストを送付)するための関数がいくつか用意されています。

といっても主に使うのは下記の2関数です。

requests.get(アドレス, パラメータ)

requests.post(アドレス, パラメータ)

ですので、この2つの関数だけでも使えるようになれば、Webサイトへのリスクエストは実現可能です。

メモ

Requestsは「get」「post」の2つが使えれば、基本的なWebアクセスは実現できる

スポンサーリンク

Webサイトにアクセスする

では実際にRequestsを使ってWebサイトにアクセスをしてみましょう。

アクセスする先は「google.com」のトップページで、そのサイトの情報を取得してみます。

import requests

res = requests.get("https://google.com")
print(res.text)

3行目で、先ほどのget関数でGoogleのURLを指定して、パラメータなしで取得した情報を表示しています。

getでの戻り値には、レスポンス情報をまとめたインスタンスが返されます。
このインスタンスから以下のプロパティを使って結果を得ることが出来ます。

プロパティ役割
text受信したコンテンツをテキストとして取得する(テキスト)
content受信したコンテンツをバイナリとして取得する(画像、ファイルなど)

今回はWebサイトのテキストページを取得しますので「text」を指定します。

これを実行してみると、Googleで表示されるWebページの内容がそのまま返ってきますので、「google.com」ページのHTMLのソースコードがそのまま取得されます。

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head>...
...(以下省略)
スポンサーリンク

パラメータを指定して取得する

単純に指定したアドレスにアクセスするだけなら、上記のようにすれば簡単に取得できます。

ただWebページにアクセスする際にはURLにクエリー用のパラメータをつけてアクセスする場合もあります。

クエリーパラメータとは「http://○○○/?xx=xx&yy=yy……」というようにアドレスの末尾に?と&をつけてキーと値の追加情報を記述します。

先ほどのgetで取得した情報はパラメータなしで取得しましたが、今度はパラメータを指定して正しく取得出来ているか確認してみましょう。

ちなみにパラメータを指定して、その値がきちんとサーバ側に送信されているかの確認は一般的なサイトではなかなか難しいので、今回は「HTTPBIN」というWebサイトを使って確認してみます。

httpbin.org
「HTTPBIN」Webサイト

このサイトはアクセスした結果をJSON形式で返してくれたりなど、プログラム開発の動作確認用にも使われますので、今回はこのサイトを使ってパラメータの確認をしてみましょう。

GETリクエストの利用

ではget関数を使ってパラメータを指定して呼び出してみましょう。

イメージとしては以下のURLをプログラム上からgetリクエストで送るイメージです。
(黄色の部分がパラメータです)

https://httpbin.org/get?id=123456&name=meguro&pass=password

作成したプログラムは以下となります。

import requests

params = {"id":123456, "name":"Meguro", "pass":"password"}
res = requests.get("https://httpbin.org/get",params)
print(res.text)

data = res.json()
args = data["args"]
for item in args:
    print(item+" の値は:"+args[item])

3行目でパラメータを辞書型に格納して、4行目のget関数の第2引数としてパラメータを送付しています。

httpbin.org/getページはアクセス情報をJSON形式のテキストデータとして返すようになっていますので、テキストを表示した後に、jsonメソッドを使ってパラメータ情報を辞書型のデータに変換して「args」キーで抜き出して表示しています。

実行した結果は以下となります。

{
  "args": {
    "id": "123456", 
    "name": "Meguro", 
    "pass": "password"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.27.1", 
    "X-Amzn-Trace-Id": "Root=1-6252e992-3430b9474071db7d07b34820"
  }, 
  "origin": "xxx.xxx.xxx.xxx", 
  "url": "https://httpbin.org/get?id=123456&name=Meguro&pass=password"
}

id の値は:123456
name の値は:Meguro
pass の値は:password

1から16行目がテキスト表示された値で、18から20行目がJSONからパラメータ値を取得して表示しています。

JSON形式のテキスト情報からパラメータ値は「args」というキーで格納されていることが分かりますので、「args」をキーにして送付した値を取り出して表示しています。

メモ

クエリーパラメータを送るときは、送る内容を辞書型にまとめてgetの引数に指定する

POSTリクエストの利用

GETリクエストは一般的なアクセスで用いられていますが、GETではアクセスできないサイトもあります。

例えばURLの末尾でパラメータで送るのではなく、フォームを使ってパラメータを送る場合などで、その場合普通にアクセスしてもうまく情報を取得出来ません。

その場合は、get関数ではなくpost関数を使ってパラメータ送信を行います。

では今度はpost関数を使ってパラメータを指定して呼び出してみましょう。

作成したプログラムは以下となります。

import requests

params = {"id":123456, "name":"Meguro", "pass":"password"}
res = requests.get("https://httpbin.org/get",params)
print(res.text)

data = res.json()
args = data["args"]
for item in args:
    print(item+" の値は:"+args[item])

3行目でパラメータを辞書型に格納して、4行目のform関数の第2引数としてパラメータを送付しています。

httpbin.org/formページはアクセス情報をJSON形式のテキストデータとして返すようになっていますので、テキストを表示した後に、jsonメソッドを使ってパラメータ情報を辞書型のデータに変換して「form」キーで抜き出して表示しています。

実行した結果は以下となります。

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "id": "123456", 
    "name": "Meguro", 
    "pass": "password"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "35", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.27.1", 
    "X-Amzn-Trace-Id": "Root=1-6252eedd-15c3557e03a7cc3d293a569e"
  }, 
  "json": null, 
  "origin": "122.208.228.193", 
  "url": "https://httpbin.org/post"
}

id の値は:123456
name の値は:Meguro
pass の値は:password

1から22行目がテキスト表示された値で、24から26行目がJSONからパラメータ値を取得して表示しています。

JSON形式のテキスト情報からパラメータ値は「form」というキーで格納されていることが分かりますので、「form」をキーにして送付した値を取り出して表示しています。

メモ

JSONデータを受け取ったら、jsonメソッドで取り出すことができる

スポンサーリンク

正規表現でデータを切り出す

GETとPOSTでそれぞれ必要なパラメータなどをつけて送信する方法が分かれば、大抵のWebページにアクセスしデータを取得することができるようなります。

JSONデータならば上記のようにjsonメソッドでインスタンスとしてデータを取り出せるため取扱は容易です。

ですが、HTMLやXMLデータの場合は受け取ったデータから情報を取り出すための処理が必要です。

ここでは1つの例として、正規表現を使ってHTMLから必要なデータを取り出してみましょう。

例えば「https://yahoo.co.jp」サイトに表示されているページから<a>タグのhref属性(リンクされているURL)だけを取り出して表示してみましょう。

先ほどのプログラムを以下のように修正してみます。

import requests
import re

params = {"id":123456, "name":"Meguro", "pass":"password"}
res = requests.get("https://yahoo.co.jp",params)

data = re.findall(r'<a href="(.*?)"(.*?)>',res.text)
for item in data:
    print('"'+item[0]+'"')

7行目で取得したHTMLデータから<a href=”…”>を正規表現を使って検索して、ヒットしたデータを取得してリンク部分のみを表示しています。

上記を実行すると、以下のように出力されます。

"https://search.yahoo.co.jp/"
"https://search.yahoo.co.jp/image"
"https://search.yahoo.co.jp/video"
"https://chiebukuro.yahoo.co.jp/"
"https://map.yahoo.co.jp/"
"https://search.yahoo.co.jp/realtime"
"https://services.yahoo.co.jp/"

このように正規表現を使うことで、取得したHTMLデータから必要な部分だけを切り出して処理することができるようになります。

その他、HTMLを解析する外部ライブラリとしては「Beautiful Soup」を使う方法なども一般的ですが、それはまた今度スクレイピングの回にでも詳しく説明しますね

スポンサーリンク

まとめ

今回は、Pythonでの外部ライブラリのWeb情報の取得に使うrequestsの利用方法について学びました。