【问题标题】:Getting Final HTML with Javascript rendered Java as String使用 Javascript 获取最终 HTML 将 Java 呈现为字符串
【发布时间】:2012-06-07 23:59:16
【问题描述】:

我想从 HTML 页面获取数据(抓取它)。但它包含 javascript 中的评论。在普通的 java url fetch 中,我只得到没有执行 Javascript 的 HTML(实际的)。我想要执行 Javascript 的最后一页。

示例:- http://www.glamsham.com/movies/reviews/rowdy-rathore-movie-review-cheers-for-rowdy-akki-051207.asp

此页面将 cmets 作为 facebook 插件,以 Javascript 的形式获取。

即使在this上也与this类似。 http://www.imdb.com/title/tt0848228/reviews

我该怎么办?

【问题讨论】:

  • 一般来说,做类似事情的唯一真正选择是利用 Web 浏览器作为您自己软件的组件。让浏览器获取页面并模拟 JavaScript 执行其操作所需的任何交互,然后检查 DOM。
  • 应该有一种方法来实现 facebook API 以从该帖子中获取 cmets 以及页面的其余内容。

标签: java javascript web-scraping


【解决方案1】:

解决该问题的简单方法。 您好,您可以使用 HtmlUnit 是 java API,我认为它可以帮助您访问执行的 js 内容,作为一个简单的 html。

WebClient webClient = new WebClient();
HtmlPage myPage = (HtmlPage) webClient.getPage(new URL("YourURL"));
System.out.println(myPage.getVisibleText());

【讨论】:

    【解决方案2】:

    你可以使用HTML Unit,一个基于java的“GUI LESS浏览器”。您可以轻松获得任何页面的最终渲染输出,因为这会像 Web 浏览器那样加载页面并返回最终渲染输出。不过,您可以禁用此行为。

    更新:你问的是例如?你不必为此做任何额外的事情:

    示例:

    WebClient webClient = new WebClient();
    HtmlPage myPage = ((HtmlPage) webClient.getPage(myUrl));
    

    更新 2:您可以按如下方式获取 iframe:

    HtmlPage myFrame = (HtmlPage) myPage.getFrameByName(myIframeName).getEnclosedPage();
    

    请阅读以上链接中的文档。在 HTMLUnit 中获取页面内容没有什么不能做的

    【讨论】:

    • 但是如果页面有一些 404 源,例如如果页面包含该位置不存在的任何 JS 文件,那么该 API 将引发异常
    • 不幸的是,您建议的库只是超级超级慢(渲染页面约 40 秒,在普通浏览器上渲染 1 秒!)
    【解决方案3】:

    使用 phantomjshttp://phantomjs.org

    var page = require('webpage').create();
    page.open("http://www.glamsham.com/movies/reviews/rowdy-rathore-movie-review-cheers-for-rowdy-akki-051207.asp")
    setTimeout(function(){
        // Where you want to save it    
        page.render("screenshoot.png")  
        // You can access its content using jQuery
        var fbcomments = page.evaluate(function(){
            return $(".fb-comments iframe").contents().find(".postContainer") 
        }) 
    },10000)
    

    您必须使用 phantom --web-security=no 中的选项来允许跨域交互(即用于 facebook iframe)

    要通过 phantomjs 与其他应用程序通信,您可以使用 Web 服务器或发出 POST 请求:https://github.com/ariya/phantomjs/blob/master/examples/post.js

    【讨论】:

    • @Ivan 我想在 Java 中而不是在 javascript 中执行此操作:P。抓取必须在 Java 中完成
    • 是一件好事,你不想用土豆做它;伙计……那很难!
    • @IvanCastellanos 虽然我同意这应该可行,但我没有在某些特定站点上获得呈现的 HTML。在示例中,站点在另一个元素中呈现像“SITE_BACKGROUND”这样的元素,但幻象从未看到它。请参阅 GIST gist.github.com/bizmate/db23887a7c5b066afafe2cc05acdd4ff。知道为什么会超时而不是获取呈现的 html 吗?
    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多