Java 通过Jsoup下载的网页源不等于实际的网页源

Java 通过Jsoup下载的网页源不等于实际的网页源,java,html,url,jsoup,Java,Html,Url,Jsoup,我在这里有一个严重的担忧。我已经搜索了整个堆栈溢出和许多其他网站。每一个地方,他们给出了相同的解决方案,我已经尝试了所有这些,但我无法解决这个问题 我有以下代码 Document doc = Jsoup.connect(url).timeout(30000).get(); 在这里,我使用Jsoup库,得到的结果并不等于我们可以看到的实际页面源代码,而是右键单击页面->页面源代码。以上代码行的结果中缺少了许多部分。 在谷歌上搜索了一些网站后,我看到了这个方法 URL url = new URL(

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

我有以下代码

Document doc = Jsoup.connect(url).timeout(30000).get();
在这里,我使用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);   
但是没有运气。
当我在互联网上搜索这个问题时,我看到很多网站,上面说我在下载网页源时必须设置正确的字符集和网页编码类型。但是我如何从我的代码中动态地了解这些东西呢??java中是否有用于此的类。我也读了一点crawler4j,但对我来说并不多。请帮帮我。I’这个问题困扰了我一个多月了。我已经尽我所能了。所以,最后的希望在于那些一直在帮助我们的神

问题可能是您的网页是由在浏览器中运行的Javascript呈现的,单独使用JSoup无法帮助您做到这一点,因此您可以尝试使用HtmlUnit,它使用Selenium来模拟浏览器:

更新

HTML之所以不同,有几个原因。最可能的情况是此网页包含包含动态页面逻辑的
元素。这可能是网页中的一个应用程序,它向服务器发送请求,并根据响应添加或删除内容

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

因此,您可以使用一个web驱动程序来模拟web浏览器,并在内存中呈现一个页面,这样它将具有与显示给用户的内容相同的内容。你甚至可以用这个驱动程序点击鼠标

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


如果您想要最真实的页面呈现,您可能需要考虑。

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

要回答您的问题,使用web浏览器查看的网页可能与使用web浏览器下载的网页不同

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

  • :当客户端(java应用程序/浏览器)请求URL时,它会将各种标题设置为请求的一部分,Web服务器可能会相应地更改响应的内容

  • :收到响应后,如果响应中存在java脚本元素,则由浏览器javascript引擎执行,这可能会更改响应的内容

  • 浏览器插件,如IE浏览器助手对象、Firefox扩展或Chrome扩展,可能会更改DOM的内容

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


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

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

    Document doc = Jsoup.connect(url)
                        .userAgent("Mozilla/5.0")
                        .timeout(30000)
                        .get();
    

    也许页面源是格式错误的HTML,JSoup正在通过删除无效部分来清理它?嗨,德诺,该网页来自一个托管良好的网站,因此我认为它应该已经通过验证,并且可能不是格式错误的HTMLhi Andrey,你能详细说明吗??我不太理解你给我的链接。我刚刚开始使用Jsoup,所以我对它的功能不是很熟悉。我想知道更多。:)更新-HtmlUnit现在可以使用WebDriver了。Andrey,我可以知道你提到的这个web驱动程序是什么吗??它是一个可以在我的java程序中使用的程序,并反过来在java程序中为我完成web浏览器的工作吗??请解释这一点-“模拟web浏览器并在内存中呈现页面的web驱动程序”和“使用此驱动程序单击鼠标”。好了:。我不太了解最近的细节。基本上,WebDriver是一种抽象,它允许您在内存中呈现和导航页面。它可以是Chromium驱动程序,Firefox驱动程序,等等。感谢Andrey的帮助,你知道如何在我的代码中使用这些web驱动程序吗?有API的吗?我猜流程应该是这样的,java代码->Web驱动程序->呈现页面->获取结果->使用Jsoup解析。如果我错了,请更正我。嗨,瓦桑斯,请按照我在你的答案下方的评论,我已经和安德烈谈过我面临的问题。我也是从硒开始的,但还是没有运气,谢谢大家来回答我的问题。酷!!漂亮的cftygv!!我在学习selenium、maven等方面经历了很多困难。。我知道Jsoup有这么简单的解决方案。是的,有了你给的wat,它对我来说工作得更快了,但对我来说,学习所有的超级东西是一次很好的经历!!谢谢!!您好,cftygv,您已经回答了我的上述问题,您的解决方案运行良好,但现在,当我将您的解决方案用于其他网站时,我再次面临相同的问题