使用HtmlUnit每页下载多个文件

时间:2013-08-11 14:48:09

标签: java htmlunit

我正在使用HtmlUnit浏览网站。 它有一个表格,下载文件清单。我想点击所有链接并收集所有文件(不用担心,信息是公开的,不禁止抓取)。

site是用JSF编写的,因此指向文档的链接实际上是<a href="#"onclick提交表单(但在此之前将隐藏字段设置为适当的值)

我的代码是(在scala中,但这没关系):

val link = row.getFirstByXPath[HtmlElement](descriptor.documentLinkPath.get)
if (link.getAttribute("href").endsWith("#")) link.setAttribute("href", "javascript:void(0)")
val documentPage: Page = link.click()
val bytes = IOUtils.toByteArray(documentPage.getWebResponse().getContentAsStream())
然而,有一个问题。正确下载第一个文档。但我无法获得第二个及以后 - 返回html页面,而不是PDF文档。 (注释掉# -> javascript:void(0)没有任何效果,我把它放在那里因为它曾经爆炸了一些例外)

Javascript已启用并使其适用于第一个文档意味着事情通常正常。但是,它不适用于下一个文档。任何想法如何解决?

2 个答案:

答案 0 :(得分:2)

如果没有网页重播,我也无法做到这一点。我认为诀窍就是从onclick()属性上执行JavaScript。

这一个:

return oamSubmitForm('broi_form','broi_form:dataTable1:4:_idJsp110',null,[['id_','3545']]);');

也许这有助于你。

public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException
{
    final WebClient webClient = new WebClient();

    HtmlPage page = webClient.getPage("http://dv.parliament.bg/DVWeb/broeveList.faces");

    for (HtmlAnchor link : (List<HtmlAnchor>) page.getByXPath("//table[@id='broi_form:dataTable1']//a/img/.."))
    {
        String commandString = link.getOnClickAttribute().replaceAll("return ", "");
        System.out.println(commandString);

        ScriptResult executeJavaScript = page.executeJavaScript(commandString);

        Page newPage = executeJavaScript.getNewPage();
        save(newPage.getWebResponse().getContentAsStream());

        page = webClient.getPage("http://dv.parliament.bg/DVWeb/broeveList.faces");
    }

}

但那不是正确的做法......

答案 1 :(得分:0)

每次下载后,这对我有用:

page = (HtmlPage) page.refresh();