代码之家  ›  专栏  ›  技术社区  ›  cdarwin

如何用HTMLUnit点击锚来下载ZIP文件

  •  0
  • cdarwin  · 技术社区  · 6 年前

    我得到的“myfile.zip”比通过普通浏览器下载的文件大(179kb对79kb),而且已经损坏。

    一个人应该如何点击一个锚并用HTMLUnit下载一个文件?

            WebClient wc = new WebClient(BrowserVersion.CHROME);
    
            final String HREF_SCARICA_CONSOLIDATI = "/web/area-pubblica/quotate?viewId=export_quotate";
    
            final String CONSOBBase = "http://www.consob.it";
    
            HtmlPage page = wc.getPage(CONSOBBase + HREF_SCARICA_CONSOLIDATI);
    
            final String downloadButtonXpath = "//a[contains(@href, 'javascript:downloadAzionariato()')]";
            List<HtmlAnchor> downloadAnchors = page.getByXPath(downloadButtonXpath);
            HtmlAnchor downloadAnchor = downloadAnchors.get(0);
    
            UnexpectedPage downloadedFile = downloadAnchor.click();
    
           InputStream contentAsStream = downloadedFile.getWebResponse().getContentAsStream();
            File destFile = new File("/tmp", "myfile.zip");
            Writer out = new OutputStreamWriter(new FileOutputStream(destFile));
            IOUtils.copy(contentAsStream, out);
            out.close();
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   RBRi    6 年前

    已经更新了一点代码片段,使其能够工作。希望内联评论有助于理解正在发生的事情(使用HtmlUnit的最新快照代码(2.34-SNAPSHOT 2018/11/03)

    final String HREF_SCARICA_CONSOLIDATI = "http://www.consob.it/web/area-pubblica/quotate?viewId=export_quotate";
    
    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {                                   
        HtmlPage page = webClient.getPage(HREF_SCARICA_CONSOLIDATI);                                               
    
        final String downloadButtonXpath = "//a[contains(@href, 'javascript:downloadAzionariato()')]";             
        List<HtmlAnchor> downloadAnchors = page.getByXPath(downloadButtonXpath);                                   
        HtmlAnchor downloadAnchor = downloadAnchors.get(0);                                                        
    
        // click does some javascript magic - have a look at your browser                                          
        // seems like this opens a new window with the content as response                                         
        // because of this we can ignore the page returned from click                                              
        downloadAnchor.click();                                                                                    
        // instead of we are waiting a bit until the javascript is done                                            
        webClient.waitForBackgroundJavaScript(1000);                                                               
    
        // now we have to pick up the window/page that was opened as result of the download                        
        Page downloadPage = webClient.getCurrentWindow().getEnclosedPage();                                        
    
        // and finally we can save to content                                                                      
        File destFile = new File("/tmp", "myfile.zip");                                                            
        try (InputStream contentAsStream = downloadPage.getWebResponse().getContentAsStream()) {                   
            try (OutputStream out = new FileOutputStream(destFile)) {                                              
                IOUtils.copy(contentAsStream, out);                                                                
            }                                                                                                      
        }                                                                                                          
    
        System.out.println("Output written to " + destFile.getAbsolutePath());                                     
    }                                                                                                              
    
        2
  •  0
  •   cdarwin    6 年前

    我曾经

    Writer out = new OutputStreamWriter(new FileOutputStream(destFile));
    IOUtils.copy(contentAsStream, out);
    

    FileOutputStream out = new FileOutputStream(destFile);
    IOUtils.copy(contentAsStream, out);