こんにちは、ミナピピン(@python_mllover)です。
ECサイトなどのスクレイピング対策が厳しいサイトをPythonでスクレイピングする際にrequestsでURLを叩いていつも通りにスクレイピングしようとするとブラウザでは何ともなく表示されるURLでも、requests経由だとレスポンスに403エラーが返されることがあります。
requestsでurlを叩くと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など世界的に有名なサイトはセキュリティも高く、そういったサイトはスクレイピングのためにサイト内のURLに短い周期で大量のリクエストを送ると、一定もしくは永久的にIPがBANされてリクエストを送っても403が返されることがあります。その場合はプロキシやTorでIPを一定間隔で変更することで対処可能です。
またサイトによってはTor経由のアクセスやVPS・レンタルサーバーからのアクセスはIPで弾いているところもあるので、そういう場合も403が返されます。(ローカルで動いたコードをクラウドにあげたら403で動かないなんていうのはよくある話・・・)
この場合はもうtime.sleepなどで向こうのIP制限の対象にならない程度で負荷を掛けないようにチマチマとスクレイピングするしかないと思います。
関連記事:【Python】WindowsでTorを使用してrequestsでスクレピングしてみた
終わり
有名なSNSやECサイトといった皆がよく使うサイトはそれだけスクレイピングの対象となりやすいため、向こうも何らかのスクレイピング対策をしているケースが多いです。
そういったサイトをうまくスクレイピングするためにはレスポンスデータの処理方法やHTMLなどへの理解だけではなくTorやリクエストヘッダーといった通信部分についても最低限の知識が必要ですね。では~
コメント