【问题标题】:Get html changes from javascript link using Java使用 Java 从 javascript 链接获取 html 更改
【发布时间】:2015-04-04 04:22:06
【问题描述】:

到目前为止,我一直在使用 JSOUP 来满足我的所有 html 网站需求。然而,我遇到了障碍。 Kickass 通过单击 javascript 链接 <a href="javascript:getFiles('52261EB9480EDFD83B5B85C8C4817D28F3AE0C95', 1);" class="showmore folded"> 获取每个 torrent 文件的完整列表。我已经将 javascript 函数追溯到使用的 *.js 文件,但我不确定如何模仿这种行为。理想情况下,我只想从主站点获取 javascript 链接,并像使用任何其他网站一样获取列表,尽管 JSOUP 的所有内容似乎都遵循 html 链接而不是 javascript 链接。

所以我尝试使用 HtmlUnit。我用 chrome 检查了网站: https://kickass.to/australian-aria-top-50-singles-13-10-2014-t9702189.html

并复制了 xpath 表达式。目前以下内容不起作用,虽然我想绕过必须将此库用于单个功能,但我无法让它正常工作。

我的测试代码:

    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
    WebClient webClient = new WebClient(BrowserVersion.CHROME);
    HtmlPage page = webClient.getPage("https://kickass.to/australian-aria-top-50-singles-13-10-2014-t9702189.html");

    HtmlElement htmlElement = page.getFirstByXPath("//*[@id=\"ul_top\"]/tbody/tr[31]/td[2]/a");
    System.out.println(htmlElement.toString());
    htmlElement.click(); 
    webClient.waitForBackgroundJavaScript(1000);

    //get changes here
    webClient.closeAllWindows();

【问题讨论】:

  • 您是否尝试使用 jsoup 下载 torrent 文件?
  • 实际使用内置库。纯粹用 JSOUP 和 htmlunit 检查种子信息。
  • 是否为 htmlunit 启用了 javascript?我已经发布了一个替代解决方案。但是,这个问题可能会有所帮助 - stackoverflow.com/questions/10136873/…

标签: java javascript html jsoup


【解决方案1】:

Jsoup 不执行 Javascript(据我到目前为止从许多问题中看到的)。您应该考虑使用Selenium + HtmlUnitDriver(这无头运行)。我已经尝试过这个示例代码,页面源包含执行 javascript 后显示的内容。

示例代码:

//set javascript enabled to true
HtmlUnitDriver driver = new HtmlUnitDriver(true);

//to set logging off....
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);

// navigate to the page
driver.get("https://kickass.to/australian-aria-top-50-singles-13-10-2014-t9702189.html");
driver.executeScript("javascript:getFiles('52261EB9480EDFD83B5B85C8C4817D28F3AE0C95', 1);","");
//this is displayed only after executing the javascript
System.out.println(driver.getPageSource().contains("Australian ARIA Top 50 Singles 13.10.2014.pdf"));
System.out.println(driver.getPageSource().contains("47. Sheppard - Geronimo.mp3"));
//System.out.println(driver.getPageSource());
driver.quit();

【讨论】:

  • 是的,效果好多了! HtmlUnit 初始化需要一些时间,但如果我通过函数解析它并看起来我可以摆脱启动过程。如果我只是使用它来浏览页面源代码,是否值得放弃 jsoup,只需使用 htmlunit/selenium,这样我就不必下载页面两次?
  • 我也在看 phantomjs,但认为它依赖于平台?
  • PhantomJS 的家伙运行一个 Ghostdriver 项目,它用于 java。 Ghostdriver 是 Webdriver 的一个实现,有一些关于它的 stackoverflow 问题。由于您只是在进行网站抓取,ghostdriver 或 htmlunitdriver 是不错的选择。
  • 事实证明...jsoup 可以向服务器发送一个帖子并检索一个 json 结果。
猜你喜欢
  • 2020-10-12
  • 1970-01-01
  • 2015-07-19
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2013-04-18
相关资源
最近更新 更多