Webスクレイピングをしていて、Webリクエストが多すぎると、サイト側のブロックに引っかかります。
今回はその回避策の紹介。
サイト側がブロックする条件は?
そもそもサイト側で、ブロックはどのようにしているかといえば、
・”同じ人”が、
・”短時間”に、
・”大量”に
リクエストを要求してきたときに、普通の使い方じゃないな、ということでブロックをします。
”短時間”に、
と
”大量”に
リクエストしたいのはスクレイピングする方はやめられないのですが、
“同じ人”が
という条件は除外することができます。
Webの世界ではなにをもって同じ人だ、と判断するかと言えば、
簡単に言うとIPアドレスといって、インターネットにつながっている場所を表すもので判断します。
“同じ人”かどうかは、インターネットとしての場所が同じかどうかで判断されるわけです。
では、現実世界では同じ人が操作していて、大量のリクエストを飛ばすんだけど、
インターネットとしての場所をバラバラにすれば、
サイト側は、それが同じ人だと認識しないのでブロック対象にならずに済みます。
Scraper APIとは?
”インターネットとしての場所をバラバラにする”サービスはいくつかあるようですが、Scraper APIはその一つです。
有料ですが、個人でやる分にはそんなに高くないと思います。
やり方は簡単で、サインアップして、API-KEYを取得して、リクエストを
http://api.scraperapi.com?api_key=(取得したAPI-KEY)&url=(実際にスクレイピングしたいURL)
にするだけです。
これ、何をやっているかというと、上で説明したように、Scraper APIに一旦リクエストを渡すと、
Scraper API側で発信先(インターネットとしての場所)をバラバラにしてリクエストし、
レスポンスを要求元に返す、ということをしています。
なので、たしかにこれをやると、これまでブロックされていたものがブロックされなくなるのですが、
注意点としては一旦Scraper APIを介していることで、レスポンスが遅くなるということです。
また、例えばアマゾンのある商品のページをリクエストする場合、
そのページの画像そのものは、商品ページ本体にはリンクとして書かれているため、
そのまま要求元で使用すると要求元からアマゾンへのリクエストが飛んでしまい、意味がなくなります。
それを防ぐため、Scraper APIは、
画像リンクなどはレスポンスするページに画像の情報を埋め込みます(バイナリで埋め込みます)。
画像データを埋め込むとデータ量が増えるので、それもレスポンス悪化の原因になると思います。
このやり方はブロックされた後、
・それが解除されるまでの時間と、
・Scraper APIを使って一つ一つのレスポンスが遅くなること
を天秤にかけて使う必要があります。
—
Webスクレイピングに関連する記事はこちら