blog-can_not_scraping

突然スクレイピングができなくなった話

2024/11/14
2024/11/14
関連ワード:pythonスクレイピング

昨日まで出来ていたスクレイピングが突然できなくなったので、解決策を備忘録として書いておく。

はじめに

スクレイピングは相手のサーバーに負荷を掛ける行為なので、サイトによっては禁止していることもあります。

スクレイピングをする際はサイトの規約等を見てルールを守って行ってください。

発生した事象

競馬予想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の改良も引き続きやっていきます。

また取れなくなったらその時に考えます。