Apache HTTPClient выдает java.net.SocketException: Сброс соединения для многих доменов

I ' m создает (хорошо себя ведет) веб-паук, и я замечаю, что некоторые серверы заставляют Apache HttpClient выдавать мне SocketException, а именно:

java.net.SocketException: Connection reset

Это вызывает код:

// Execute the request
HttpResponse response; 
try {
    response = httpclient.execute(httpget); //httpclient is of type HttpClient
} catch (NullPointerException e) {
    return;//deep down in apache http sometimes throws a null pointer...  
}

Для большинства серверов это нормально. Но для других он немедленно вызывает SocketException.

Пример сайта, который вызывает немедленное SocketException: http://www.bhphotovideo.com/

Отлично работает (как и большинство веб-сайтов): http : //www.google.com/

Как видите, www.bhphotovideo.com отлично загружается в веб-браузере. Он также отлично загружается, когда я не использую HTTP-клиент Apache. (Код вроде этого :)

 HttpURLConnection c = (HttpURLConnection)url.openConnection();  
 BufferedInputStream in = new BufferedInputStream(c.getInputStream());  
 Reader r = new InputStreamReader(in);     

 int i;  
 while ((i = r.read()) != -1) {  
      source.append((char) i);  
 }  

Так почему бы мне просто не использовать этот код вместо этого? Что ж, в HTTP-клиенте Apache есть несколько ключевых функций, которые мне нужно использовать.

Кто-нибудь знает, что заставляет некоторые серверы вызывать это исключение?

На данный момент исследования:

  • Проблема возникает на моих локальных компьютерах Mac и экземпляре AWS EC2, поэтому это не локальный брандмауэр.

  • Кажется, что ошибка вызвана не удаленным компьютером, потому что в исключении не указано «по узлу»

  • Это переполнение стека кажется относительным java.net.SocketException: Сброс соединения , но ответы не показывают, почему это может происходить только из HTTP-клиента Apache, а не других подходов.

Дополнительный вопрос: I Я изрядно ползаю с этой системой. Есть ли вообще лучший класс Java для этого, кроме HTTP-клиента Apache? Я обнаружил ряд проблем (например, исключение NullPointerException, которое я должен уловить в приведенном выше коде). Кажется, что HTTPClient очень требователен к обмену данными с сервером - более требователен, чем я бы хотел для сканера, который может ' просто ломаться, когда сервер не работает.

Всем спасибо!

Решение

Честно говоря, у меня нет идеального решения, но оно работает, так что для меня этого достаточно.

Как указано ниже Олегом, Bixo создал краулер, который настраивает HttpClient для большего прощение серверам. Чтобы «обойти» проблему больше, чем исправить ее, я просто использовал SimpleHttpFetcher, предоставленный Bixo здесь: (ссылка удалена - ТАК думает, что я спамер, так что вам придется погуглить самостоятельно)

SimpleHttpFetcher fetch = new SimpleHttpFetcher(new UserAgent("botname","contact@yourcompany.com","ENTER URL"));
try {
    FetchedResult result = fetch.fetch("ENTER URL");
    System.out.println(new String(result.getContent()));
} catch (BaseFetchException e) {
    e.printStackTrace();
}

Обратной стороной этого решения является то, что для Bixo существует множество зависимостей - так что это может быть не очень хорошо работать для всех. Однако вы всегда можете просто поработать с их использованием DefaultHttpClient и посмотреть, как они создали его, чтобы заставить его работать. Я решил использовать весь класс, потому что он выполняет некоторые функции для меня, такие как автоматическое отслеживание переадресации (и сообщение конечного URL-адреса назначения), которые полезны.

Всем спасибо за помощь.

Изменить: TinyBixo

Привет все. Итак, мне понравилось, как работает Bixo, но не понравилось то, что у него было так много зависимостей (включая весь Hadoop). Итак, я создал значительно упрощенный Bixo без всех зависимостей. Если вы столкнулись с проблемами, указанными выше, Я бы порекомендовал его использовать (и не стесняйтесь делать запросы на включение, если хотите обновить!)

Он доступен здесь: https://github.com/juliuss/TinyBixo

8
задан Community 23 May 2017 в 12:30
поделиться