4

我在这里有一个严重的担忧。我已经通过堆栈溢出和许多其他站点进行了搜索。他们在每个地方都提供相同的解决方案,我已经尝试了所有这些,但我无法解决这个问题。

我有以下代码,

Document doc = Jsoup.connect(url).timeout(30000).get();

这里 m 使用 Jsoup 库,我得到的结果不等于我们可以看到的实际页面源,但右键单击页面 -> 页面源。我使用上述代码行得到的结果中缺少许多部分。在谷歌上搜索了一些网站后,我看到了这个方法,

URL url = new URL(webPage);
        URLConnection urlConnection = url.openConnection();
        urlConnection.setConnectTimeout(10000);
        urlConnection.setReadTimeout(10000);
        InputStream is = urlConnection.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);



        int numCharsRead;
        char[] charArray = new char[1024];
        StringBuffer sb = new StringBuffer();
        while ((numCharsRead = isr.read(charArray)) > 0) {
            sb.append(charArray, 0, numCharsRead);
        }
        String result = sb.toString();          

        System.out.println(result);   

但没有运气。当我在互联网上搜索这个问题时,我看到许多网站说我必须在下载网页的页面源代码时设置网页的正确 charSet 和编码类型。但是我将如何动态地从我的代码中了解这些东西?java中是否有任何类。我也经历了一点 crawler4j,但对我来说并没有多大作用。请帮助各位。我在这个问题上坚持了一个多月。我已经尽我所能。所以最后的希望寄托在一直提供帮助的堆栈溢出之神身上!

4

3 回答 3

5

我最近有这个。我会遇到某种机器人保护。将您的原始行更改为:

Document doc = Jsoup.connect(url)
                    .userAgent("Mozilla/5.0")
                    .timeout(30000)
                    .get();
于 2013-11-16T16:30:10.077 回答
3

问题可能是您的网页是由在浏览器中运行的 Javascript 呈现的,仅 JSoup 无法帮助您解决此问题,因此您可以尝试使用使用 Selenium 模拟浏览器的 HtmlUnit:使用 Jsoup 登录和抓取数据

更新

HTML 不同的原因有很多。最有可能的是该网页包含<javascript>包含动态页面逻辑的元素。这可能是您网页中的一个应用程序,它向服务器发送请求并根据响应添加或删除内容。

JSoup 永远不会呈现这样的页面,因为它是 Chrome、Firefox 或 IE 等浏览器的工作。JSoup 是一个轻量级的解析器,用于从服务器获取的纯文本 html。

所以你可以做的是你可以使用一个网络驱动程序来模拟一个网络浏览器并在内存中呈现一个页面,所以它会有与向用户显示的相同的内容。您甚至可以使用此驱动程序单击鼠标。

链接答案中 Web 驱动程序的建议实现是 HtmlUnit。这是最轻量级的解决方案,但是,它可能会给您带来意想不到的结果:Selenium v​​s HtmlUnit?.

如果您想要最真实的页面渲染,您可能需要考虑Selenium WebDriver

于 2013-11-13T18:55:12.997 回答
1

为什么要以这种方式解析网页?如果网站上有可用的消费服务,则该网站可能有一个REST API

为了回答您的问题,使用网络浏览器查看的网页可能不同,因为使用URLConnection下载了相同的网页。

以下可能是导致这些差异的几个原因:

  1. 请求标头:当客户端(Java 应用程序/浏览器)发出对 URL 的请求时,它会将各种标头设置为请求的一部分,并且 Web 服务器可能会相应地更改响应的内容。

  2. Java Script:一旦收到响应,如果响应中存在 java 脚本元素,它会由浏览器的 javascript 引擎执行,这可能会改变DOM的内容。

  3. 浏览器插件,例如 IE Browser Helper Objects、Firefox Extensions 或 Chrome Extensions 可能会改变 DOM 的内容。

简单来说,当您使用 URLConnection 请求 URL 时,您正在接收原始数据,但是当您使用浏览器的地址栏请求相同的 URL 时,您会得到处理(通过 javascript/浏览器插件)网页。

URLConnection/JSoup 将允许您根据需要设置请求标头,但由于第 2 点和第 3 点,您仍然可能会得到不同的响应。Selenium 允许远程控制浏览器并具有访问渲染页面的 api。Selenium 用于 Web 应用程序的自动化测试。

于 2013-11-13T20:25:59.153 回答