Python スクレイピング

【Python】Requestsでサイトをスクレイピングした時に403エラーが返された時の解決策

この記事は約4分で読めます。

 

 

こんにちは、ミナピピン(@python_mllover)です。

 

ECサイトなどのスクレイピング対策が厳しいサイトをrequestsなんかでいつも通りにスクレイピングしようとするとブラウザでは何ともなく表示されるのに、requests経由だとレスポンスに403エラーが返されることがあります。

 

例)

import requests
url = 'https://www.monotaro.com/g/04557970/'
res = requests.get(url=url)
print(res) # 403が返されるorレスポンスが変えてこずタイムアウトになる

 

今回はそんなときの対処法としてよく使う手段をまとめて紹介していきます。

 

スポンサーリンク
スポンサーリンク

よくある403の原因

 

①リクエストヘッダーがない

 

多分これがよくある原因No1だと思いますが、解決策はrequest.get()の引数にheadersを付け加えてheaderの中身に’User-Agent’という自分がどういうブラウザでアクセスしているか伝える識別子があるのでそこに以下のような感じで設定します。これがないとbot判定され403が返されるというのがよくあるパターンです。

 

home_url = 'https://www.monotaro.com'

headers = {
    'User-Agent':'Mozilla/5.0'
}

res = requests.get(url=url, headers=headers)

 

②referがない

 

サイトによってはreferがないとアクセスをはじくという仕様のところも存在します。その場合は先ほどの’User-Agent’と同じように以下のような要領で”referer”というパラメーターを追加してあげます。

 

home_url = 'https://www.monotaro.com'
url = 'https://www.monotaro.com/g/04557970/'
headers = {
    'User-Agent':'Mozilla/5.0',
    "referer":home_url
}

res = requests.get(url=url, headers=headers)

 

③IP制限されている

 

Itunes storeなどのセキュリティ意識の高いサイトはスクレイピングのために同じサイトに短い周期で大量のリクエストを送ると、一定もしくは永久的にIPがBANされてリクエストを送っても403が返されることがあります。その場合はプロキシやTorでIPを一定間隔で変更することで対処可能です。

 

またサイトによってはTor経由のアクセスやVPS・レンタルサーバーからのアクセスはIPで弾いているところもあるので、そういう場合も403が返されます。(ローカルで動いたコードをクラウドにあげたら403で動かないなんていうのはよくある話・・・)この場合はもうtime.sleepなどで向こうのIP制限の対象にならない程度で負荷を掛けないようにチマチマとスクレイピングするしかないと思います。

 

関連記事:【Python】WindowsでTorを使用してrequestsでスクレピングしてみた

 

終わり

 

SNSやECサイトなど皆がよく使うのサイトはそれだけスクレイピングの対象となりやすいため、向こうも何らかのスクレイピング対策をしているケースが多いです。

 

そういったサイトをうまくスクレイピングするためにはレスポンスデータの処理方法やHTMLなどへの理解だけではなくTorやリクエストヘッダーといった通信部分についても最低限の知識が必要ですね。では~

 

 

 

コメント

タイトルとURLをコピーしました