jsoup は HTTP プロキシ経由でページを取得し、同じ呼び出しでレスポンスを解析できます。

Document page = Jsoup.connect("https://www.example.com/")
    .proxy("proxy.example", 8080)
    .get();

ホスト名と整数ポートがプロキシを識別します。許可された公開ページへのリクエストには、利用中のサービスまたはHTTP プロキシ一覧から HTTP エンドポイントを選びます。connect に渡す URL は目的のページのままです。この経路を追加するためだけに、別の URLConnection で HTML を文字列にダウンロードする必要はありません。

proxy(String, int) はそのリクエストの HTTP プロキシを選択します。1080 のようなポート番号はプロトコルを SOCKS に変えません。プロキシのエンドポイントは、設定する種類に対応している必要があります。jsoup は java.net.Proxy を受け取るオーバーロードも公開していますが、特定の経路のサポートは使用中の HTTP 実装に依存します。

ワーカーごとに独自のリクエストを与える

リクエスト単位のオプションは、ダウンロードごとに JVM のシステムプロパティを変更するよりも並列処理を簡単にします。可変のリクエストはワーカーごとに分けて保持します。現代の jsoup は、新しいリクエストを作る際にセッションの設定と Cookie ストアを共有できます。

Connection session = Jsoup.newSession();
Document first = session.newRequest()
    .url("https://www.example.com/one")
    .proxy("proxy-a.example", 8080)
    .get();
Document second = session.newRequest()
    .url("https://www.example.com/two")
    .proxy("proxy-b.example", 8080)
    .get();

上記の呼び出しは明確さのために順番に実行しています。処理を同時に配分する場合は、実行中の 1 つの Connection でプロキシを変えるのではなく、リクエストを独立して作成してください。共有セッションは Cookie も共有します。閲覧の同一性を分けたままにしたい場合は別のセッションを使ってください。

これらのインターフェースは jsoup 1.21.2 に存在します。引数なしの newRequest() インターフェースは 1.14.1 からあるため、古いアプリケーションはセッションの例を採用する前に依存関係を確認してください。

認証情報は認証付きプロキシの追加要件です。経路の選択に成功してもアカウントは提供されません。また、プロキシのチャレンジを受け取ることは、そのポートに接続できないこととは異なります。

関連記事