1

製品に関する苦情を探すために定期的に苦情掲示板サイトをスクレイピングするアラート システムを作成しようとしています。私は同じためにJsoupを使用しています。以下は、私にエラーを与えるコードフラグメントです。

doc = Jsoup.connect(finalUrl).timeout(10 * 1000).get();

これは私にエラーを与えます

java.net.SocketException: Unexpected end of file from server

ブラウザーに同じ finalUrl 文字列をコピーして貼り付けると、機能します。次に、簡単なURL接続を試しました

            BufferedReader br = null;
            try {
                URL a = new URL(finalUrl);
                URLConnection conn = a.openConnection();

                // open the stream and put it into BufferedReader
                br = new BufferedReader(new InputStreamReader(
                        conn.getInputStream()));
                doc = Jsoup.parse(br.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }

しかし、結局のところ、接続自体が null を返しています (br は null)。問題は、同じ文字列をコピーしてブラウザに貼り付けると、サイトがエラーなしで開くのはなぜですか?

完全なスタック トレースは次のとおりです。

java.net.SocketException: Unexpected end of file from server
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:774)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:771)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
    at ComplaintsBoardScraper.main(ComplaintsBoardScraper.java:46)
4

1 に答える 1

3

それはトリッキーでした!:-)

サーバーは、適切なユーザー エージェントを持たないすべてのリクエストをブロックします。ブラウザでは成功したが、Java では失敗したのはそのためです。

幸いなことに、jsoup ではユーザー エージェントの変更は大したことではありません。

final String url = "http://www.complaintsboard.com/?search=justanswer.com&complaints=Complaints";
final String userAgent = "Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)";

Document doc = Jsoup.connect(url) // you get a 'Connection' object here
                        .userAgent(userAgent) // ! set the user agent
                        .timeout(10 * 1000) // set timeout
                        .get(); // execute GET request

最初に見つけたユーザー エージェントを使用しましたが、代わりに任意の有効なユーザー エージェントを使用できると思います。

于 2013-03-11T15:21:04.840 に答える