3

http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=550633c179112c8002bc6a0942d55b2a&artist=lucinda%20williams&track=lake%20charlesのコンテンツをクロールするために Jsoup を使用したい

コードは次のとおりです。

    Document doc = Jsoup.connect("http://ws.audioscrobbler.com    /2.0/?method=track.getInfo&api_key=550633c179112c8002bc6a0942d55b2a&artist=lucinda williams&track=lake charles")
                        .userAgent("Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0")
                        .timeout(5000)
                        .get();

ただし、何か問題が発生します。

    Exception in thread "main" java.net.SocketException: Unexpected end of file from server
            at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770)
            at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
            at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:767)
            at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1162)
            at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:397)
            at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:429)
            at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:410)
            at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:164)
            at org.jsoup.helper.HttpConnection.get(HttpConnection.java:153)
            at JsoupXML.main(JsoupXML.java:16)

しかし、ブラウザを使用してその URL にアクセスすると、すべて問題ありません。さらに、上記のコードを使用してhttp://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=550633c179112c8002bc6a0942d55b2a&artist=cher&track=believeのコンテンツをクロールすると、すべて問題ありません。

その理由と、それを解決するための良いアイデアを教えていただけますか?

ご清聴ありがとうございました。私の英語について申し訳ありません。

NeplatnyUdaj の親切な助けに感謝します。すばらしいヒントを教えてください。Whitspace やその他の特殊記号を %20、%26 などに置き換えるのを忘れていました。

4

2 に答える 2

3

良い。この例外は、リモート サーバーが予期せず接続を閉じたことを意味します。

以下の回答は、質問コードの URL に表示されているすべてのスペースが実際にはコードに存在しないことを前提としています。

例外をキャッチして再試行する (またはユーザーにエラーを報告する) 以外にできることはほとんどありません。

サーバーが接続を閉じた理由について:

  • リクエストが気に入らなかった場合 (ここで再試行しても役に立ちません)、audioscrobbler のドキュメントを確認してください
    • そこにホストヘッダーがあり、正しいですか(あなたの例では、そこにスペースがあるため、正しくありません)?
    • 有効なリクエストを作成するには、他のヘッダーを含める必要がありますか?
    • その API キーは正しいですか?
  • 現在、サーバーに問題がある可能性があります (リクエストをドロップする原因となります。これは、再試行が役立つ場合があります)
  • あなたがあまりにも多くの質問をしていると判断し、アンチスパム保護が適用されています (これは、再試行が問題となる場所です)。

関連するメモ: 質問に API キーを含めることは最適ではない可能性があります。

于 2013-06-24T12:04:07.783 に答える
1

ユーザー エージェントを変更します (または少なくとも定義します)。

詳細: サイトのスクレイピング

于 2013-06-24T11:53:21.937 に答える