クローラーを作成しています。200かどうかに関係なく、ストリームからデータを取得する必要があります。 CURLは標準のブラウザと同様にそれを行っています。
次のものは実際にはリクエストのコンテンツを取得しませんが、いくつかはありますが、httpエラーステータスコードで例外がスローされます。関係なく出力が必要ですが、方法はありますか?このライブラリは永続的な接続を実際に行うため、このライブラリを使用することを好みます。これは、実行しているクロールの種類に最適です。
package test;
import Java.net.*;
import Java.io.*;
public class Test {
public static void main(String[] args) {
try {
URL url = new URL("http://github.com/XXXXXXXXXXXXXX");
URLConnection connection = url.openConnection();
DataInputStream inStream = new DataInputStream(connection.getInputStream());
String inputLine;
while ((inputLine = inStream.readLine()) != null) {
System.out.println(inputLine);
}
inStream.close();
} catch (MalformedURLException me) {
System.err.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.err.println("IOException: " + ioe);
}
}
}
うまくいきました、ありがとう:これは私が思いついたものです-概念の大まかな証明として:
import Java.net.*;
import Java.io.*;
public class Test {
public static void main(String[] args) {
//InputStream error = ((HttpURLConnection) connection).getErrorStream();
URL url = null;
URLConnection connection = null;
String inputLine = "";
try {
url = new URL("http://verelo.com/asdfrwdfgdg");
connection = url.openConnection();
DataInputStream inStream = new DataInputStream(connection.getInputStream());
while ((inputLine = inStream.readLine()) != null) {
System.out.println(inputLine);
}
inStream.close();
} catch (MalformedURLException me) {
System.err.println("MalformedURLException: " + me);
} catch (IOException ioe) {
System.err.println("IOException: " + ioe);
InputStream error = ((HttpURLConnection) connection).getErrorStream();
try {
int data = error.read();
while (data != -1) {
//do something with data...
//System.out.println(data);
inputLine = inputLine + (char)data;
data = error.read();
//inputLine = inputLine + (char)data;
}
error.close();
} catch (Exception ex) {
try {
if (error != null) {
error.close();
}
} catch (Exception e) {
}
}
}
System.out.println(inputLine);
}
}
シンプル:
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
if (connection instanceof HttpURLConnection) {
HttpURLConnection httpConn = (HttpURLConnection) connection;
int statusCode = httpConn.getResponseCode();
if (statusCode != 200 /* or statusCode >= 200 && statusCode < 300 */) {
is = httpConn.getErrorStream();
}
}
説明については、Javadocを参照してください。これを処理する最良の方法は次のとおりです。
URLConnection connection = url.openConnection();
InputStream is = null;
try {
is = connection.getInputStream();
} catch (IOException ioe) {
if (connection instanceof HttpURLConnection) {
HttpURLConnection httpConn = (HttpURLConnection) connection;
int statusCode = httpConn.getResponseCode();
if (statusCode != 200) {
is = httpConn.getErrorStream();
}
}
}
openConnection
を呼び出した後、次のことを行う必要があります。
URLConnectionをHttpURLConnectionにキャストします
GetResponseCodeを呼び出す
応答が成功した場合はgetInputStreamを使用し、それ以外の場合はgetErrorStreamを使用します
(成功のテストは200 <= code < 300
有効なHTTP成功コードが200以外にあるためです。)
クローラーを作成しています。200かどうかに関係なく、ストリームからデータを取得する必要があります。
コードが4xxまたは5xxの場合、「データ」は何らかのエラーページである可能性があることに注意してください。
最後に、「robots.txt」ファイルを尊重し、利用規約を読んでから、所有者のサイトのコンテンツをクロール/スクレイピングしてください可能性がありますケア。 GETリクエストを単純に打ち消すと、サイトの所有者を困らせる可能性があります。