前回までで、jsoupを使ってYahoo!ニュースの記事をスクレイピングする方法を一通り紹介できたはずだ。今回は、スクレイピングをする上で重要なプロキシの使い方について紹介する。

そもそもスクレイピングでプロキシを使う理由は、「一つのIPアドレスから連続してアクセスし続けていると、サーバーに負荷を掛けてしまい、相手方に被害になるばかりか、最終的にはアクセスを拒否されてデータを取得できなくなる」からである。なので通常、スクレイピングにおいては、リクエストのスパンを調整するだけでなく、プロキシを利用して複数のIPアドレスからデータを取得するのが一般的である。(必要なデータ数が少ない場合は、この限りでは無い。)

実は、jsoupはバージョン1.9以前はプロキシに対応していなかった。だから、プロキシに対応させる為にやや面倒なコードを書かなくてはならなかった。しかし、バージョン1.9以降では、以下のように簡単にプロキシを通す事ができる。以下では、amazon web servicesのグローバルIPをチェックできるサイトに接続し、プロキシを通す前と通した後の結果をチェックするプログラムである。

最初の出力は、元のグローバルIPアドレスが表示されるはずである。次に、プロキシを通す場合は、proxy(String host, int port)をget()の前に呼び出すだけである。hostとportには任意のプロキシサーバーのホストとポートを渡せば良い。

代わりにproxy(Proxy proxy)を呼び出しても良い。その場合は、先に以下のような定義をしておけば良い。

とりあえず動かしてみたいが適当なプロキシが無いという人は、

http://www.freeproxylists.net/ja/

なら、無料で利用できる公開プロキシがリスト化されているので、これを使ってみるのも手だろう。(但し、プロキシの安全性については注意。)

やはり、実務的には自前のプロキシサーバーを立てるか、有料のプライベートプロキシを使うべきだ。通常、javaでプロキシのBasic認証を行うのは非常に煩雑である。しかし、jsoupでは比較的簡単に認証有りのプロキシ接続が可能である。

まず、プロキシの認証に必要なIDとパスワードをコロンで結び、Base64エンコードしてやる。(JDK1.8より前の場合はApache Commons Codecを使うと良い。)あとは、jsoupで接続する際に、header(String name, String value)を呼び出し、ヘッダに認証情報を付加してやれば良いだけだ。

次回はjsoupとは離れるが、Timerについて紹介しよう。