Почему время ожидания JSoup истекает в случайных местах моего кода?

#java #web-scraping #connection #timeout #jsoup

#java #очистка веб-страниц #подключение #тайм-аут #jsoup

Вопрос:

В настоящее время я пытаюсь использовать JSoup в Java для очистки retrosheets.org для проекта по кодированию бейсбола, над которым я работаю.

Я выполняю несколько подключений JSoup в своем коде, и некоторые из этих подключений выполняются в цикле (следовательно, выполняются много-много раз). Итак, в общей сложности, я делаю сотни подключений в своей программе, чтобы очистить необходимые данные.

Программа работает ~ 5 секунд, но затем зависает на соединении (каждый раз другом). Затем, когда я пытаюсь получить доступ к веб-сайту отдельно в своем браузере, веб-сайт не загружается. Что может быть причиной этого? Есть ли проблема с выполнением слишком большого количества подключений?

Вот пример соединения, которое я выполняю (все соединения соответствуют этому же формату).

 doc = Jsoup.connect("https://www.retrosheet.org/boxesetc/index.html").maxBodySize(0).userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15").get();
  

Это ошибка, которую я получаю

Ответ №1:

Это, безусловно, защита от нагрузки на стороне целевого веб-сайта — она обнаруживает слишком много запросов с одного и того же IP и блокирует его на некоторое время или ограничивает количество подключений / запросов с этого IP. Вот почему вы также не можете открыть веб-сайт в браузере — дело вовсе не в JSoup или Java, а в том, что соединения / запросы с вашего IP на целевой веб-сайт блокируются / регулируются.

Комментарии:

1. Есть ли способ обойти это? Спасибо за ответ.

2. Ну, вы могли бы ограничить свои запросы — например, вставить задержки в код, который их выполняет. Также вы могли бы реализовать повторные попытки (необязательно с задержкой между попытками). Также может возникнуть проблема с несколькими созданными вами соединениями — JSoup, вероятно, не будет повторно использовать соединения, но если вы используете Commons HttpClient с менеджером подключений пула соединений — это произойдет. Вы могли бы получить HTML через Commons HttpClient, а затем использовать JSoup только для синтаксического анализа (не используя его возможности HTTP-клиента). Лучше всего сделать все это (задержки повторные попытки Общий HttpClient для извлечения).

3. Вот метод для синтаксического анализа строки как HTML с помощью JSoup (параметр base URL есть, чтобы позволить JSoup предоставлять абсолютные URL-адреса из относительных, кстати): jsoup.org/apidocs/org/jsoup /…

4. P.S. Если мой ответ правильно решает вашу проблему — не могли бы вы поддержать его и / или пометить как правильный ответ? Спасибо!