使用Java从javascript链接获取html更改

时间:2015-04-04 04:22:06

标签: java javascript html jsoup

到目前为止,我一直在使用JSOUP来满足我的所有html网站要求。然而,我遇到了障碍。 Kickass通过点击javascript链接 <a href="javascript:getFiles('52261EB9480EDFD83B5B85C8C4817D28F3AE0C95', 1);" class="showmore folded"> 获取每个种子文件的完整列表。我已经将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();

1 个答案:

答案 0 :(得分:2)

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();