この記事は公開から4年以上経過しています。
Python3+pandasでWEBページをスクレイピングをしたとき403 Forbidden
で取得できない場合の備忘録。
WEBサイトによっては利用規約などによりスクレイピング行為を禁止しています。著作権侵害や動産不法侵入、業務妨害となる場合もあるため十分にご注意ください。
問題
Python3+pandasでHTMLテーブルを取得するためにrequests.get()
を使ってWEBページを取得すると403 Forbidden
でデータを取得できない。
原因
pythonでデータを取得するとユーザーエージェントがPython-urllib/3.8
などのようになるため、WEBサーバー側がボット(WEBブラウザによるアクセスではない)と判断してアクセスを拒否している可能性がある。
対応
WEBページ取得時にユーザーエージェントを変更する。
サンプルソースコード
import pandas as pd
import requests
# 取得するWEBページのURL
url = 'https://example.com/'
# HTTPリクエストヘッダにユーザーエージェントを設定
headers = {'User-agent': 'Mozilla/5.0'}
# WEBページデータを取得
response = requests.get(url=url, headers=headers)
response.encoding = response.apparent_encoding
# HTMLテーブルを取得
df = pd.read_html(response.text)
ちなみに、もしユーザーエージェントで弾かれていると思われる場合は、
- ブラウザのアドインなどでユーザーエージェントを
python-requests
やPython-urllib
に変えてアクセスする。 - サイトの
robots.txt
の記載を確認する。
などの方法でも確認できるかもしれません。
以上です。