SocketTimeoutException при разборе веб-сайта (HW)

Мы учимся использовать JSOUP и urlconnection, поэтому мы анализируем страницы с веб-сайта по нашему выбору и анализируем страницы, чтобы ответить на интересные вопросы.

Все работает хорошо, однако время от времени я получаю исключение SocketTimeOutException. Я думаю, это потому, что веб-сайт отключает мою программу (или отключает меня по времени, или дросселирует, или что-то в этом роде).

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

Есть ли лучший способ справиться с этим? Это причина, по которой я получаю исключение?

Кроме того, поможет ли это как-то менять IP каждые несколько минут (и возможно ли это в Java)? Спасибо


person William Falcon    schedule 25.05.2013    source источник
comment
посмотрите на stackoverflow.com/questions/6571548/   -  person    schedule 16.01.2014


Ответы (1)


Все работает хорошо, однако время от времени я получаю SocketTimeOutException. Я думаю, это потому, что веб-сайт отключает мою программу (или отключает меня по времени, или дросселирует, или что-то в этом роде).

Сбой соединения в HTTP ожидается. Такова природа протокола. Для этого может быть много причин (ваш newtork нестабилен, их сеть нестабильна, их брандмауэр думает, что вы их атакуете, и блокирует, ВАШ брандмауэр думает, что вы подвергаетесь атаке, и блокирует).

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

Я буду спать каждый раз, когда я успешно получаю страницу ИЛИ каждый раз, когда возникает ошибка, а затем повторяю попытку. Я бы не стал ждать так много (15 минут?), Я бы сделал максимум 1 минуту для обоих.

Есть ли лучший способ справиться с этим? Это причина, по которой я получаю исключение?

Как сказано, вы получаете исключение из-за сети. С этим ничего не поделаешь, это нормальное поведение сети.

Кроме того, поможет ли это как-то менять IP каждые несколько минут (и возможно ли это в Java)?

Поможет, если целевой веб-сайт ведет какой-либо журнал и блокирует IP-адрес после n запросов. Тем не менее, вы не можете изменить его так, как хотите, с помощью Java. IP-адрес принадлежит машине (а не программе) и в большинстве случаев назначается кем-то другим, а не вами.

Вы можете делать HTTP-запросы через прокси, и тогда их IP-адреса будут достигать целевого сервера (и вы будете менять прокси, когда один из них будет забанен), но это сделает ваше соединение еще более нестабильным, так как вы добавляете еще один слой на "транзакцию".

person acdcjunior    schedule 25.05.2013
comment
очень полезно, спасибо. Как вы думаете, случайный сон (30) секунд тоже слишком много? Должен ли я просто делать случайные 10 секунд (рекурсивно). Также как насчет VPN, не изменит ли это мой IP-адрес в глазах веб-страницы? - person William Falcon; 26.05.2013
comment
Послушайте, если вы спите, чтобы избежать блокировки, сумма будет сильно зависеть от настроек веб-сайта цели. (Если они блокируют кого-то, кто делает более одного запроса в минуту, вы, конечно, захотите спать одну минуту между запросами). Но если вы спите только из-за нестабильности, то 10 секунд вполне достаточно. - person acdcjunior; 26.05.2013
comment
Что касается VPN, он может изменить ваш IP (в конечном счете, мы не можем сказать наверняка, так как мы не знаем, как настроена ваша сеть), но у вас все равно будет тот же IP каждый раз, когда вы делаете запрос. Если целевой сайт блокирует IP-адреса на основе количества запросов, то от использования VPN нет никакой выгоды (вы будете заблокированы таким же образом). Если только... у вас много VPN и вы продолжаете их менять (как я сказал про прокси в конце ответа). - person acdcjunior; 26.05.2013