0. ウェブクローリング中にブロックが発生した場合、原因は何でしょうか?
ウェブクローリングを経験した開発者は、無条件にブロックを経験したことがあるでしょう。
私のクローラーは完璧だったのに、どこで問題が発生したのかわからずにイライラしましたか?
この投稿では、代表的なブロックの原因に焦点を当て、解決策を紹介します。
クローリングは店に入って欲しい商品を取ってくることと似ています。私たちは店に入るときに守るべき暗黙のルールがあります。例えば、店に入るときに靴の泥を取り除いて入ったり、傘をきちんとたたんで傘立てに立てたり、相手に不快感を与えない服装などがあるでしょう。
また、店ごとに店主独自のルールがある場所も時折あります。その場合は、そのルールを必ず守らなければ、その店を利用することができません。最近のカフェのように「お問い合わせはDMで」する必要がある場合や、レストランの場合はトレイを直接返却する必要がある場合、または席に置いて行く場合などです。
このように、クローリングにも守るべきルールがあります。代表的なものは、User-Agentやその他のパラメータが存在しないか、または奇妙に設定されているリクエストは、ウェブサイトがボットと判断してブロックされる可能性がある場合です。
したがって、最も基本的には、User-Agentをボットとして見えないように設定することから始める必要があります。
1. User-Agentを設定してみましょう
User-Agentを設定する方法は、HTTPリクエストヘッダーにUser-Agent値を入れることです。User-Agent値は、ウェブブラウザやHTTPクライアントの種類とバージョンを示す文字列です。
例えば、Chromeブラウザでは、次のようなUser-Agent値が使用されています。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
クローラーでもUser-Agent値を設定すると、ウェブサイトはそのリクエストがブラウザから送信されたリクエストであると判断します。したがって、User-Agent値を設定しないと、ウェブサイトはそのリクエストがクローラーから送信されたリクエストであると判断してブロックする可能性が高くなります。
User-Agent値を設定する方法は、HTTPリクエストライブラリごとに異なりますが、一般的にはHTTPリクエストヘッダーにUser-Agent値を入れることができます。Pythonでは、requestsライブラリを使用する際に次のようにUser-Agent値を設定できます。
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
response = requests.get("http://example.com", headers=headers)
このように、requestsライブラリでは、headers引数を使用してHTTPリクエストヘッダーにUser-Agent値を設定できます。
しかし、最近ではUser-Agentだけでなく、さらに多様な方法でクローリングブロックを試みるサイトが増えているため、User-Agent設定以外にも他の方法を併用することが望ましいです。例えば、IPアドレスを頻繁に変更したり、クローリング速度を調整したりする方法があります。
2. IPアドレスをできるだけ頻繁に変更する
同じIPアドレスで継続的に接続要求を送信することは、ウェブサイトから見ると非常に怪しいと思われるかもしれません。
IPアドレスを頻繁に変更する簡単な方法の1つは、VPNを使用することです。VPNはVirtual Private Networkの略で、インターネット接続を通じてユーザーのIPアドレスを隠し、他の地域のIPアドレスに変更するサービスです。
VPNを使用すると、IPアドレスを毎回変更する必要がなく、VPNを介してインターネットに接続されていると認識されるため、ブロックされる可能性が低くなります。また、VPNを使用すると、以前にブロックされたIPアドレスを使用する必要がないため、クローリングをより安定して実行できます。
3. クローリング速度を不規則に調整する
機械のように正確なタイミングと間隔でリクエストを送信すると、ボットとして認識される可能性が高くなります。したがって、クローリング速度を一定でないように調整する設定が必要です。
クローリング速度を調整する方法には、大きく分けて2つの方法があります。
1つ目の方法は、クローリングリクエスト間の間隔を調整することです。通常、短い間隔でクローリングリクエストを送信すると、サーバーがこれを認識してブロックする可能性が高くなります。したがって、一定の間隔でクローリングリクエストを送信することが望ましいです。
2つ目の方法は、さまざまなIPアドレスを使用することです。同じIPアドレスから継続的にクローリングリクエストを送信すると、サーバーがこれを認識してブロックする可能性が高くなります。そのため、複数のIPアドレスを使用してクローリングリクエストを送信することが望ましいです。これを実現するためには、プロキシサーバーを使用することができます。
4. 正確なパラメーターの設定
先ほどUser-Agentを設定する際にheaderを設定しました。
クローリングを行う際に、HTTPリクエストヘッダーに設定する必要があるパラメーターがない場合や、逆に設定してはいけないパラメーターがある場合にも問題が発生する可能性があります。
例えば、User-Agent値を設定しない場合、一部のウェブサイトではブラウザから送信されたリクエストでないと認識されてブロックされる可能性があります。また、HTTPリクエストヘッダーに含まれてはいけないクッキー値を設定して送信すると、ウェブサイトがこれを認識してブロックする可能性があります。
そのため、クローリングを行う際には、HTTPリクエストヘッダーに設定すべきパラメーターが何か、またはないべきパラメーターがあるかを注意深く確認して調整する必要があります。
5. 適切な例外処理
クローリング中にエラーが発生し、同じリクエストを継続的に送信すると、ウェブサイトはこれをボットと認識してブロックする可能性が高くなります。そのため、適切な例外処理を行う必要があります。
例外処理とは、プログラムの実行中に予期しない状況に備えてエラーを処理することを指します。
例えば、HTTPリクエストを送信する際にサーバーから応答がない場合、リクエストが失敗します。この場合、プログラムはこれを認識し、一定時間待ってから再度リクエストを送信するように例外処理を行う必要があります。
また、ウェブサイトでルールに違反するクローリングリクエストを送信すると、ウェブサイトはこれをブロックします。この場合は、例外処理を通じてプログラムがこれを認識し、リクエストを中止するようにする必要があります。そのためには、HTTPリクエストを送信する際に、ウェブサイトが返すステータスコードを確認し、それに応じて例外処理を行う必要があります。
例外処理は、クローリングにおいて非常に重要な部分です。適切な例外処理を行うことで、クローリングを安定して実行することができます。
結論
ウェブクローリングを安定して実行するためには、User-Agentの設定、IPアドレスの変更、クローリング速度の不規則化、正確なパラメーターの設定、そして適切な例外処理など、さまざまな方法を使用してウェブサイトのブロックを回避する必要があります。
ブロックに遭遇した場合は、上記の5つの原則が適切に反映されているかを確認し、良い結果を得られることを願います。




