2013-03-11 152 views
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爲空)。現在的問題是,爲什麼粘貼在瀏覽器中的同一個字符串打開網站時沒有任何錯誤?

完整堆棧跟蹤是如下:

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) 
+0

您的網址是否以'http://'開頭,您的服務器是否允許連接到端口'80'? – ollo 2013-03-11 09:45:17

+0

@ollo yes網址以http://開頭。服務器是一個不在我控制範圍內的遠程服務器。雖然當我在服務器上嘗試「nc」命令時,它說:連接到complaintsboard.com 80端口[tcp/http]成功! – rishi 2013-03-11 14:02:21

+0

你在URL中有沒有非轉義字符,或者是你的應用程序阻止了internetaccess?網址是否重定向到另一個? – ollo 2013-03-11 14:14:17

回答

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 

我已經採取了我發現的第一個用戶代理...我想你可以使用任何有效的一個,而不是太多。

+0

我在思考類似的問題,但從來沒有能夠很快得到答案。非常感謝。 – rishi 2013-03-11 15:54:25

+2

我一直在考慮將jsoup中的useragent默認爲看起來像瀏覽器的東西,因爲這會吸引很多人。任何關於利弊的想法? – 2013-03-14 23:37:01

+1

這是一個好主意,但它有一個缺點:一些網站使用用戶代理來決定向用戶顯示哪個網站(可能是瀏覽器的「桌面」版本(firefox等)和智能手機的「移動版」 (android等))。如果你設置了一個「桌面」用戶代理,你將解決像這裏所問的問題。但另一方面,如果除了「移動」版本,他也會獲得「桌面」版本。 – ollo 2013-03-15 16:17:59