刮一个网站

时间:2013-03-11 07:29:07

标签: java web-scraping jsoup

我正在尝试编写一个警报系统,定期搜索投诉委员会网站,以查找有关我产品的任何投诉。我正在使用Jsoup。下面是给我错误的代码片段。

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

这给了我错误

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

当我在浏览器中复制粘贴相同的finalUrl String时,它可以正常工作。然后我尝试了简单的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)

1 个答案:

答案 0 :(得分: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

我已经找到了我发现的第一个用户代理...我猜你也可以使用任何有效的用户代理。