「PythonでWebページへアクセスしたい」
このような場合、真っ先にRequestsが候補となります。
この記事では、Requestsについて解説しています。
そして、Requestsの限界についても触れています。
本記事の内容
- Requestsとは?
- Requestsのシステム要件
- Requestsのインストール
- Requestsの動作確認
それでは、上記に沿って解説していきます。
Requestsとは?
Requests: 人間のためのHTTP
https://requests-docs-ja.readthedocs.io/en/latest/
Requestsとは、PythonのHTTPライブラリのことです。
Requestsにより、PythonからWebページにアクセスが可能となります。
Webアクセスという基本機能のため、多くのライブラリでも利用されています。
そして、依存するパッケージとして同時にインストールされます。
そのため、知らず知らずのうちにRequestsをインストールしているかもしれません。
それぐらい、RequestsはPython界で重要なライブラリだと言えます。
以上、Requestsについての説明でした。
次は、Requestsのシステム要件を確認します。
Requestsのシステム要件
現時点(2021年9月末)でのRequestsの最新バージョンは、2.26.0となります。
この最新バージョンは、2021年7月13日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応のはずです。
- Windows
- macOS
- Linux
公式ページなどには、クロスプラットフォームは明示していません。
一般的にサポートOSの明示がない場合は、クロスプラットフォーム対応です。
「わざわざ言う必要もないだろう」という感じなのでしょうかね。
実際、WindowsとLinux(Ubuntu)での動作は確認済です。
あとは、サポート対象となるPythonのバージョンは以下となります。
- Python 2.7
- Python 3.5
- Python 3.6
- Python 3.7
- Python 3.8
- Python 3.9
もう、古いPythonは切り捨ててもいいと思います。
以下のPythonの公式開発サイクルに従えば、それで十分です。
| バージョン | リリース日 | サポート期限 |
| 3.6 | 2016年12月23日 | 2021年12月 |
| 3.7 | 2018年6月27日 | 2023年6月 |
| 3.8 | 2019年10月14日 | 2024年10月 |
| 3.9 | 2020年10月5日 | 2025年10月 |
その意味では、Requestsの開発者が頑張り過ぎと言えます。
互換性維持の労力は、なんだかんだで手間になります。
その分だけの労力を機能改善に注いだ方が、みんな幸せになれるはずです。
以上より、Requestsのシステム要件はほぼないと言えます。
次は、Requestsをインストールしていきます。
Requestsのインストール
まずは、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ---------- ------- pip 21.2.4 setuptools 58.1.0
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、Requestsのインストールです。
Requestsのインストールは、以下のコマンドとなります。
pip install requests
インストールは、すぐに終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。
>pip list Package Version ------------------ --------- certifi 2021.5.30 charset-normalizer 2.0.6 idna 3.2 pip 21.2.4 requests 2.26.0 setuptools 58.1.0 urllib3 1.26.7
依存するパッケージも、requestsと一緒にインストールされました。
それらを見る限り、既存環境へ比較的容易にRequestsを導入できそうです。
以上、Requestsのインストールを説明しました。
最後は、Requestsの動作確認を行います。
Requestsの動作確認
Requestsの動作確認では、次の二つを取得します。
- 対象ページのレスポンス(htmlソース)
- 対象ページのレスポンスヘッダー
それぞれを以下で確認します。
対象ページのレスポンス(htmlソース)
import requests
r = requests.get('https://example.com/')
print(r.text)
上記を実行した結果は、以下。
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
このようにhtmlソースを丸ごと取得できます。
そのため、Requestsはスクレイピングで利用されることがあります。
ただし、Requestsは静的ページのスクレイピングでしか有効ではありません。
Ajaxを用いた動的ページとなると、途端に使いモノにならなくあります。
この点を注意して、Requestsを利用しましょう。
対象ページのレスポンスヘッダー
import requests
r = requests.get('https://example.com/')
headers = r.headers
for data in headers:
print(data + ":" + headers[data])
上記を実行した結果は、以下。
Content-Encoding:gzip Age:411716 Cache-Control:max-age=604800 Content-Type:text/html; charset=UTF-8 Date:Thu, 23 Sep 2021 00:03:59 GMT Etag:"3147526947+gzip" Expires:Thu, 30 Sep 2021 00:03:59 GMT Last-Modified:Thu, 17 Oct 2019 07:18:26 GMT Server:ECS (sab/56BC) Vary:Accept-Encoding X-Cache:HIT Content-Length:648
まとめ
上記からわかるように、簡単にウェブページの情報を取得できます。
ただし、ページによっては上記のコードが動かない場合があります。
一概には言えませんが、いろいろとチェックするページが存在します。
チェックの内容は、ボットかどうかをチェックすることが多いです。
そのようなチェックをされた場合、ボットの判定を受けてしまいます。
そうなったら、上記のコードが機能しません。
これが、Requestsの限界と言えますね。
限界には、動的ページに対応できないことも含まれます。
ただし、その回避方法は存在します。
Seleniumを利用すれば、基本的にはボットの判定は受けません。
Seleniumについては、次の記事で解説しています。


