2013-03-11 158 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