昨日まで出来ていたスクレイピングが突然できなくなったので、解決策を備忘録として書いておく。
突然スクレイピングができなくなった話
はじめに
スクレイピングは相手のサーバーに負荷を掛ける行為なので、サイトによっては禁止していることもあります。
スクレイピングをする際はサイトの規約等を見てルールを守って行ってください。
発生した事象
競馬予想AIの改良のためにデータの再収集をするとデータが取れず、レスポンスを見ると400エラーになっていた。
最初に確認したこと
まずはサイトの規約に変更がないか確認
データベースの閲覧ができない・通信制限がかかった(スクレイビングについて)スクレイピングによって多数のリクエスト(アクセス)を確認し、弊社サービスに対して支障があると判断した場合は、予告なく通信制限をかけさせていただくことがございます。
その場合、解除のご依頼をいただきましても解除できかねますこと、ご了承ください。
<利用規約>
第17条(その他の禁止事項)15項
上記各号の他、法令、このメンバー規約もしくは公序良俗に違反(売春、暴力、残虐等)する行為、サービスの運営を妨害する行為、当社の信用を毀損し、もしくは当社の財産を侵害する行為、または他者もしくは当社に不利益を与える行為。
=====
上記は、スクレイピングなどの行為によりサービスの運営に支障をきたす場合も含まれます。
スクレイピングはご自身の責任で、上記利用規約に抵触しないかを確認をお願いいたします。
2024/11/08時点ではサーバーに大きい負荷を掛けなければ自己責任でやって良さそうなので、改めて原因と回避策を考える。
解決策
そもそも何の情報をもとにブロックされてるか考える。
ブラウザで普通にページを見ることはできるのでIPアドレスではなさそう。
次にありそうなのはユーザーエージェントで、
調べてみるとrequestライブラリでリクエスト送信をするときのユーザーエージェントは「python-requests/{ライブラリのバージョン}」だそうなので試しにcurlコマンドを実行してみる。
1$ curl -A "python-requests/2.26.0" -o /dev/null -s -w "%{http_code}\n" https://db.netkeiba.com/horse/sire/000a011996/
2400
ステータスが400で返ってきたのでどうやらユーザーエージェントが原因ぽい。
今度はブラウザで使用されている形式のユーザーエージェントで400エラーにならないか確認する。
1$ curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" -o /dev/null -s -w "%{http_code}\n" https://db.netkeiba.com/horse/sire/000a011996/
2200
200が返ってきたので問題なさそう。
この設定をrequests.getメソッドで使ってもうまく行くか確認。
1headers = {
2 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
3}
4response = requests.get(url, headers=headers)
requests.getメソッドでユーザーエージェントを使用する場合は、headersの引数にdictで{"User-Agent":値}の形式で指定する。
処理を動かしてみると問題なく動いたのでこれで良さそう
終わり
ということで今回の事象については解決。
データの収集もできるようになったのでAIの改良も引き続きやっていきます。
また取れなくなったらその時に考えます。