Загрузка страницы через HTTP-прокси в jsoup
Используйте HTTP-прокси API jsoup на уровне запроса и создавайте отдельные запросы, когда несколько обработчиков используют общие настройки сеанса.
jsoup может загрузить страницу через HTTP-прокси и разобрать ответ в том же вызове:
Document page = Jsoup.connect("https://www.example.com/")
.proxy("proxy.example", 8080)
.get();
Имя хоста и целочисленный порт идентифицируют прокси. Для разрешённых запросов к публичным страницам выберите HTTP-эндпоинт из вашего сервиса или из списка HTTP-прокси. URL, переданный в connect, остаётся нужной вам страницей. Чтобы добавить этот маршрут, не нужно скачивать HTML в строку через отдельный URLConnection.
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();
Вызовы выше выполняются последовательно ради наглядности. Если работа распределяется одновременно, создавайте запросы независимо, а не меняйте прокси у одного выполняющегося Connection. Общий сеанс разделяет и cookie; используйте разные сеансы, когда идентичности просмотра должны оставаться раздельными.
Эти интерфейсы присутствуют в jsoup 1.21.2. Интерфейс newRequest() без аргументов появился в 1.14.1, поэтому более старое приложение должно проверить зависимость, прежде чем применять пример с сеансом.
Учётные данные — дополнительное требование для аутентифицированного прокси. Успешный выбор маршрута не предоставляет учётную запись, а получение запроса аутентификации от прокси отличается от невозможности подключиться к его порту.