Код зависает при попытке получить код ответа - PullRequest
0 голосов
/ 21 апреля 2011

Я пытаюсь сканировать 300 000 URL. Однако где-то посередине код зависает при попытке получить код ответа из URL. Я не уверен, что происходит не так, как соединение устанавливается, но проблема возникает после этого. Любые предложения / указатели будут с благодарностью. Кроме того, есть ли способ проверить связь с веб-сайтом в течение определенного периода времени, и если он не отвечает, просто перейдите к следующему?

Я изменил код в соответствии с предложениями, установив время чтения и свойство запроса, как было предложено. Однако даже сейчас код не может получить код ответа!

Вот мой модифицированный фрагмент кода:

URL url=null;

try
{
    Thread.sleep(8000);
}
catch (InterruptedException e1)
{
    e1.printStackTrace();
}

try
{
    //urlToBeCrawled comes from the database
    url=new URL(urlToBeCrawled);
}
catch (MalformedURLException e)
{
    e.printStackTrace();
    //The code is in a loop,so the use of continue.I apologize for putting code in the catch block.
    continue;
}
HttpURLConnection huc=null;
try
{
    huc = (HttpURLConnection)url.openConnection();

}
catch (IOException e)
{
    e.printStackTrace();
}
try
{
   //Added the request property
    huc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
    huc.setRequestMethod("HEAD");

}
catch (ProtocolException e)
{
    e.printStackTrace();
}

huc.setConnectTimeout(1000);
try
{
    huc.connect();

}
catch (IOException e)
{

    e.printStackTrace();
    continue;
}

int responseCode=0;
try
{
    //Sets the read timeout
    huc.setReadTimeout(15000);
    //Code hangs here for some URL which is random in each run
    responseCode = huc.getResponseCode();

}
catch (IOException e)
{
    huc.disconnect();

    e.printStackTrace();
    continue;
}
if (responseCode!=200)
{
    huc.disconnect();
    continue;
}

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

Сервер держит соединение открытым, но также не отвечает. Возможно, вы даже обнаружите, что вы запускаете их сайт, и брандмауэр или анти-DDOS инструменты намеренно пытаются сбить вас с толку. Убедитесь, что вы установили пользовательский агент (некоторые серверы разозлятся, если вы этого не сделаете). Кроме того, установите тайм-аут чтения, так что если он не сможет прочитать через некоторое время, он выдаст:

huc.setReadTimeout(15000);
0 голосов
/ 22 апреля 2011

Это действительно должно быть сделано с использованием многопоточности. Особенно , если вы пытаетесь 300 000 URL. Я предпочитаю подход с пулом потоков для этого.

Во-вторых, вы действительно выиграете от более надежного HTTP-клиента, такого как http-клиент apache commons, поскольку он может лучше настраивать user-agent. Принимая во внимание, что большинство JRE не позволят вам модифицировать пользовательский агент, используя класс HttpURLConnection (они принудительно применяют его к вашей версии JDK, например: Java/1.6.0_13 будет вашим пользовательским агентом.) Существуют трюки, чтобы изменить это, настроив системное свойство, но я никогда не видел, чтобы это действительно работало. Опять же, просто зайдите с HTTP-библиотекой Apache Commons, вы не пожалеете об этом.

Наконец, вам нужен хороший отладчик http, чтобы в конечном итоге справиться с этим. Вы можете использовать Fiddler2 и просто настроить прокси-сервер Java для указания на fiddler (прокрутите до части о Java ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...