#スクレイピング対策について
直近でECサイトをいくつかスクレイピングする業務に携わっていました。
ただ、スクレイピング用のスクリプトを回していてしばらくすると
以下のようなポップアップが出ることがあります。
例えばこのAmazonの例だと、このポップアップが出るとこいつが邪魔をして処理が進まなくなってしまいます。
サイト側も情報を取られたくないので、こういった外部からの機械的なアクセスを遮断するための対策を講じています。
「いやWebサイト上で誰でも見れる情報だから守る意味がないのでは?」と思った方もいるかもしれませんが、ECサイトではレビュー情報や販売データを企業に販売しているケースがあり、そのデータが勝手に抜かれていると困るのです。
私の場合ECサイトの動向を追うため定期的に同じサイトをスクレイピングしていたため、よくこの類のポップアップに邪魔されていました。
そうなってくると「スクレイピング対策の対策」が必要になってくるわけです...
##対策その① プロキシ外から通信させる:効果△
業務としてスクレイピングやクローリングをされる場合、社内のプロキシを通して行う場合が多いと思います。
私は「プロキシを通すってことは、外から見えるIPアドレスがずっと同じになるから止められやすいのでは!?」と考えました。
私の部署ではプロキシを通さずに直接外に出す無線LANが存在するため、そちらを使ってスクレイピングを実行してみました。
結果的には**「調子がいい時もあれば悪い時もある」**という具合です。笑
正直、プロキシ云々はあまり関係ないような気がします...
社内から実行してあまりに弾かれるときなどに、無線を使ってチャレンジしてみるとたまに通る時があったりしたのでネットワークをちょこちょこ変えるのは意味があるのかもしれません。知らんけど。
##対策その② 処理する速度を落とす:効果○
私の場合、スクレイピングの処理の中で何度もページをめくる処理が入っていました。
最初は何の設定もしていなかったのですが、ページの情報を取得してから次のページに遷移する前に処理を指定時間止めるようにしました。
Pythonであればsleep
で簡単に指定できます。
スクレイピング処理を人間の動きに近づける、という考えですね。
2,3秒では効果は薄く、10~15秒程止めるとかなり効果がありました。
※ネット上では「5秒」で効果があるという記載が多かったですが私の現場では10秒で目に見えて効果が出ました。
ただし、当たり前ですが毎ページ○○秒止めるというのは実行時間が爆発的に増えます。
そこらへんは状況にあわせてチューニングする必要があります。
##対策その③ 処理する量を減らす:効果○
先程のその②に似ていますが、一度に処理する量を減らすということです。
例えば100ページのスクレイピングをしなければならないとすると
月~金に20ページずつ処理して1週間で100ページ終わらせるという具合です。
私の業務はウィークリーで情報を取得する必要があっため
上記のように処理をできるだけ分散させることで、現象の発生を軽減できました。
##対策その④ ユーザーエージェントを設定する:△
ある日先輩に「てか、ユーザーエージェントって設定してる?」と言われました。
「何言ってるんだこの人は」と思いながら話を聞いてみると
「まずそこから対応しなきゃじゃん...」ってなもんでした。
ユーザーエージェントについてはこちらのページを読んで見てください。
https://qiita.com/arribux/items/4c2b3382ca71f29a6b8a
「Ruby Mechanize でスクレイピングをするときに User-Agent は必須」
とりあえずユーザーエージェントを設定しないと「ロボットが動かしているということが丸わかり、ということです。
「これ設定すれば全部解決なんじゃね?」というぐらいな情報でしたが
なぜかあまり効果はでませんでした...(私の設定がちゃんとできていなかったのかも...)
私はPythonのseleniumを使っていたため以下のページを参考にしていました。
https://zafiel.wingall.com/archives/7016
詳しい方いたら、ユーザーエージェントの効果について教えてください....
#まとめ
私の業務内の経験だけで言えば、「できるだけ遅く、少ない量」にすることで
ロボットチェックを回避するという果てしなく泥臭いやり方に落ち着いてしまいました...
ユーザーエージェントの設定の他にも有効な手段があれば是非教えてください!!