Python3+pandasによるWEBスクレイピングで403 Forbiddenが出るときの対応

この記事は公開から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-requestsPython-urllibに変えてアクセスする。
  • サイトのrobots.txtの記載を確認する。

などの方法でも確認できるかもしれません。


以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする