1

300,000のURLをクロールしようとしています。ただし、URLから応答コードを取得しようとすると、途中でコードがハングします。接続が確立されているため、何が問題になっているのかわかりませんが、その後問題が発生しています。任意の提案/ポインタは大歓迎です。また、特定の期間Webサイトにpingを実行し、応答しない場合は次のWebサイトに進む方法はありますか?

提案に従って読み取りタイムアウトと要求プロパティを提案に従ってコードを変更しましたが、今でもコードは応答コードを取得できません!

これが私の変更されたコードスニペットです:

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;
}
4

2 に答える 2

1

サーバーは接続を開いたままにしていますが、応答もしていません。あなたが彼らのサイトをスパイダリングしていて、ファイアウォールまたはアンチDDOSツールが意図的にあなたを混乱させようとしていることを検出しているかもしれません。必ずユーザーエージェントを設定してください(設定しないと一部のサーバーが怒ります)。また、読み取りタイムアウトを設定して、しばらくして読み取りに失敗した場合に、あきらめるようにします。

huc.setReadTimeout(15000);
于 2011-04-21T04:49:33.133 に答える
0

これは実際にはマルチスレッドを使用して実行する必要があります。特に、300,000のURLを試行している場合。私はこれにスレッドプールアプローチを好みます。

次に、apache commons httpクライアントなどのより堅牢なHTTPクライアントを使用すると、ユーザーエージェントをより適切に設定できるため、実際にメリットが得られます。ほとんどのJREでは、HttpURLConnectionクラスを使用してユーザーエージェントを変更することはできません(JDKバージョンに強制します。たとえばJava/1.6.0_13、ユーザーエージェントになります)。システムプロパティを調整してこれを変更するトリックがありますが、私はそれが実際に機能するのを見たことがありません。繰り返しになりますが、Apache Commons HTTPライブラリを使用するだけで、後悔することはありません。

最後に、これを最終的に処理するには、優れたhttpデバッガーが必要です。Fiddler2を使用して、fiddlerを指すようにJavaプロキシを設定するだけです(Javaに関する部分までスクロールしてください)。

于 2011-04-22T16:15:04.527 に答える