こんにちは、かつコーチです。
Webサイトから情報を自動で取得したいけれど、何から手をつけていいか分からない。
そんな方に向けて、この記事ではrequests(PythonからWebサイトにアクセスするための代表的なライブラリ)の基本的な使い方を解説します。
あわせて、スクレイピングを行ううえで欠かせない倫理・利用規約への注意点も説明します。
読み終える頃には、requestsで安全にWebページを取得できるようになります。
基本の書き方・実装手順
requestsのインストール
requestsは標準ライブラリではないため、事前にインストールが必要です。
pip install requests
手順1:requests.get()でページを取得する
requests.get()に取得したいURLを渡すと、そのページの情報がまとめて返ってきます。
import requests
url = "https://example.com"
response = requests.get(url)
print(response.status_code)
print(response.text[:200])
responseにはWebサーバーからの応答(レスポンス)がすべて格納されています。
response.textはHTMLの中身を文字列として取得したものです。
手順2:ステータスコードを確認する
ステータスコード(リクエストが成功したかどうかを示す3桁の数字)を確認することは、スクレイピングの基本です。
import requests
url = "https://example.com"
response = requests.get(url)
if response.status_code == 200:
print("取得成功")
print(response.text[:200])
else:
print(f"取得失敗:ステータスコード {response.status_code}")
200は成功、404はページが見つからない、403はアクセス拒否を意味します。
ステータスコードを確認せずにresponse.textを使ってしまうと、エラーページの中身をそのまま処理してしまう危険があります。
手順3:タイムアウトとエラー処理を設定する
実務では、通信エラーやサーバーの応答遅延に備える必要があります。
import requests
url = "https://example.com"
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
print("取得成功")
print(response.text[:200])
except requests.exceptions.Timeout:
print("タイムアウトしました。")
except requests.exceptions.RequestException as e:
print(f"リクエストエラーが発生しました:{e}")
timeout=5は、5秒応答がなければ処理を打ち切る設定です。
raise_for_status()は、ステータスコードが400番台・500番台のときに例外を発生させるメソッドです。
つまずきやすい設定・注意点
スクレイピングを実行する前に、必ず対象サイトのrobots.txt(サイトがクローラーに許可・禁止する範囲を示すファイル)を確認してください。
また、多くのサイトの利用規約でスクレイピングを制限・禁止しているケースがあります。
商用利用や大量アクセスを行う前には、必ず対象サイトの利用規約を確認し、必要であれば運営元に問い合わせることをおすすめします。
短時間に大量のリクエストを送ると、サーバーに負荷をかけたり、アクセス禁止(IPブロック)になったりする可能性もあります。
time.sleep()でリクエストの間隔を空けるなど、相手のサーバーに配慮した実装を心がけましょう。
よくあるつまずきポイント・エラー対処
文字化けした状態でテキストを取得してしまう
これは筆者が実際に日本語サイトのスクレイピングを試したときに遭遇したつまずきです。
response.textをそのまま出力したところ、日本語部分が文字化けして表示されました。
❌ Before(エンコーディングを指定しない書き方)
import requests
url = "https://example.co.jp"
response = requests.get(url)
print(response.text[:300])
実行結果は次のように文字化けしてしまいました。
縺薙s縺ォ縺。縺ッ縲∵勧遘代〒縺兀
requestsは、レスポンスヘッダーの情報からエンコーディングを推測しますが、この推測が外れることがあります。
このサイトはUTF-8で書かれていましたが、requestsが別のエンコーディングと誤判定していました。
✅ After(エンコーディングを明示的に指定する書き方)
import requests
url = "https://example.co.jp"
response = requests.get(url)
response.encoding = response.apparent_encoding
print(response.text[:300])
response.apparent_encodingは、実際のバイト列の内容から文字コードを推測してくれるプロパティです。
これをresponse.encodingに明示的に代入することで、文字化けを解消できました。
サイト側でエンコーディングが分かっている場合は、response.encoding = "utf-8"のように直接指定してもかまいません。
日本語サイトを扱う際は、この一手間を忘れずに入れましょう。
まとめ
この記事のポイント
requests.get()でWebページの情報を取得できるresponse.status_codeで取得の成否を必ず確認するtimeoutとraise_for_status()でエラーに備える- スクレイピング前にrobots.txtと利用規約を必ず確認する
- 文字化けする場合は
response.apparent_encodingでエンコーディングを補正する
次に読むべき記事
- BeautifulSoupでHTMLを解析する
- reモジュールで正規表現を使う
- スケジュール実行を自動化する(schedule/cron連携)
タグ: Python, 中級者向け, 自動化