2017-11-28 15 views
0

問題があります。私はCSVファイルにURLs(〜12000)の魔女を持っています応答コード私はチェックする必要があります。私のプログラムはURLsを1つずつチェックしています。しかし、34回の反復の後、私のコードは毎回落ちます。 34行のURLが存在しません。次回このエラープログラムに出会って自分のコードを修正して、そのエラープログラムをスキップして作業を続ける方法。 私はコードを書いた: パッケージlt.local;この問題を克服するHttpURLConnectionによってgetResponseCodeで「java.net.ConnectException:Connection」エラーが返される

import org.apache.commons.csv.CSVFormat; 
import org.apache.commons.csv.CSVParser; 
import org.apache.commons.csv.CSVRecord; 

import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.Reader; 
import java.net.ConnectException; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

public class OffersUrlChecker { 
    private static final String SAMPLE_CSV_FILE_PATH = "d:\\LENAL\\ZUD\\load\\offers.csv"; 
    public static void main(String[] args) throws IOException { 
     try (
      Reader reader = Files.newBufferedReader(Paths.get(SAMPLE_CSV_FILE_PATH)); 
      CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT) 
     ){ 
     Iterable<CSVRecord> csvRecords = csvParser.getRecords(); 
      for (CSVRecord csvRecord : csvRecords) { 
       String url = csvRecord.get(0); 
       URL myUrl = new URL(url); 
       HttpURLConnection myUrlCon = (HttpURLConnection) myUrl.openConnection(); 
       int code = myUrlCon.getResponseCode(); 
       System.out.println(csvRecord.getRecordNumber()+" - "+code+" " + url); 
       } 
      }/*catch (ConnectException e){ 
      System.out.println("java.net.ConnectException: Connection refused: connect"); 
     }*/ 
    } 
} 

Exception in thread "main" java.net.ConnectException: Connection refused: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:673) 
    at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173) 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558) 
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) 
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1138) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1032) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1546) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474) 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) 
    at lt.zudykkaina.OffersUrlChecker.main(OffersUrlChecker.java:29) 

Process finished with exit code 1 
+0

他の側が立て続けにリクエストをブロックしている可能性があります。リクエストの間にスリープ時間を追加してみてください。 – KillerX

+0

私はそれも考えましたが、34行のURLが悪いので、次回エラーをスキップするようにコードをアップグレードしたいと思います。 – Andrew

答えて

0

三の提案:

  1. のtry catchブロック内のコールを埋め込みます。
  2. リソースを解放するためにURL接続を閉じます。オープンソケットを蓄積している可能性があります。
  3. 各エラーの後、処理を続行する前に少し待ってください。一部のサーバーでは、非常に迅速な順序でURLにヒットするため、ユーザーをブロックする可能性があります。

これらの線に沿って何か:

public class OffersUrlChecker { 

    private static final String SAMPLE_CSV_FILE_PATH = "d:\\LENAL\\ZUD\\load\\offers.csv"; 

    public static void main(String[] args) throws IOException { 
     try (
       Reader reader = Files.newBufferedReader(Paths.get(SAMPLE_CSV_FILE_PATH)); 
       CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT) 
     ) { 
      Iterable<CSVRecord> csvRecords = csvParser.getRecords(); 
      for (CSVRecord csvRecord : csvRecords) { 
       String url = csvRecord.get(0); 
       URL myUrl = new URL(url); 
       HttpURLConnection myUrlCon = null; 
       try { 
        myUrlCon = (HttpURLConnection) myUrl.openConnection(); 
        int code = myUrlCon.getResponseCode(); 
        System.out.println(csvRecord.getRecordNumber() + " - " + code + " " + url); 
       } catch (Exception e) { 
        Logger.getLogger(OffersUrlChecker.class.getName()).log(Level.SEVERE, 
          String.format("Could not read from %s", url), e); 
        // sleep a bit 
        try { 
         TimeUnit.SECONDS.sleep(10); 
        } catch (InterruptedException e1) { 
         Logger.getLogger(OffersUrlChecker.class.getName()).log(Level.WARNING, 
           "Sleep interrupted", e); 
        } 
       } finally { 
        if (myUrlCon != null) { 
         myUrlCon.disconnect(); // Make sure you close the sockets 
        } 
       } 
      } 
     } 
    } 
} 
+0

ありがとうございます** gil.fernandes **。例外が変更されました: '重大度:https://liebherr.neriba.lt/saldytuvai/liebherr-cb-4815-saldytuvas.htmlから読み取れませんでした java.net.ConnectException:接続が拒否されました:connect' – Andrew

+0

サーバーが接続。自動ウェブクロールを防ぐための対策が講じられている可能性があります。それでも、上のコードを使用してサイトに移動し続けてクエリを実行できるはずです。例外の後でさえ、プロセスは死ぬべきではありません。 –

+0

** gil.fernandes **ありがとうございました!それは本当に私を助ける解決策です!私にとって未知の方法のいくつかは、私はそれらについて読む買う。 – Andrew

関連する問題