NETWORK ENGINEER BLOG

Tips and Reviews for Engineers

Python の requests モジュールについて

requests モジュールとは

HTTP 通信ライブラリで、Web サイトの情報を収集することができます。
主に Beautiful Soup モジュールと組み合わせて、Web スクレイピングに使用されます。

実行例

コード
import requests
res = requests.get('https://automatetheboringstuff.com/files/rj.txt') 
print(res.text[:250])
出力結果
The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare

This eBook is for the use of anyone anywhere at no cost and with
almost no restrictions whatsoever.  You may copy it, give it away or
re-use it under the terms of the Projec

解説

基本的な使い方

コードの記述方法は、以下のとおりです。

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

戻り値として response オブジェクトが返ってきます。主な response は次のとおりです。

response 内容
status_code ステータスコード
text レスポンスの内容
encoding エンコーディング
cookies クッキーの内容
事前準備

必要に応じて pip をインストールします。

> sudo zypper install python3-pip

requests モジュールをインストールします。

> pip3 install requests
Web ページのダウンロード

Web ページをダウンロードし、冒頭 250 文字だけを表示します。

import requests
res = requests.get('https://automatetheboringstuff.com/files/rj.txt') 
print(res.text[:250])
エラーチェック

Response オブジェクトの res.raise_for_status() メソッドで、エラーチェックが可能です。
ファイルのダウンロードが失敗すれば例外をおこし、成功すれば何もしません。

res.raise_for_status

存在しない URL のダウンロードを試行した場合は、以下のようになります。

>>> res = requests.get('https://automatetheboringstuff.com/files/rj.txt_notexist') 
>>> res.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/site-packages/requests/models.py", line 943, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://automatetheboringstuff.com/files/rj.txt_notexist

ダウンロードの失敗が、プログラムを停止させるほどのものでない場合、res.raise_for_status() の行を try/except で囲むことで、異常終了せずに、エラーを処理することも可能です。

import requests
res = requests.get('https://automatetheboringstuff.com/files/rj.txt_notexist') 
try:
    res.raise_for_status()
except Exception as exc:
    print('問題あり:{}'.format(exc))

上記を設定して、ダウンロードに失敗した場合は、以下のように表示されます。

問題あり:404 Client Error: Not Found for url: https://automatetheboringstuff.com/files/rj.txt_notexist

応用的な使い方

ダウンロードしたファイルの保存

ダウンロードした Web ページを、open 関数と write メソッドを使って、ファイルを保存することができます。
ざっくりしたポイントは、次のとおりです。

  • open 関数の第 2 引数に文字列 wb を渡して、「バイナリ書き込みモード」でファイルを作成します。*1
  • Response オブジェクトの iter_content メソッドを使ってループ処理を行い、データを複数回にわけて書き込みます。*2
import requests
res = requests.get('https://automatetheboringstuff.com/files/rj.txt') 
res.raise_for_status()
play_file = open('RomeoAndJuliet.txt', 'wb')
for chunk in res.iter_content(100000):
    play_file.write(chunk)
play_file.close()

参考書籍

以上

*1:Web ページの文字コードを維持するため、プレーンテキストのページであったとしても、バイナリモードで保存する必要があります。

*2:100K バイトでわける場合は、 iter_content(100000) とします。