通过服务器下载文件进程,使用 HtmlUnit

问题描述

我想在以下位置自动进行文件转换https://www.gpsvisualizer.com/map_input?form=googleearth。 我的问题是,gpsvisualizer 允许独立转换,但我有 500 个文件要转换。 所以我使用 hmtlUnit 来自动化这个过程。

感谢以下代码,我可以修改“select”,例如:

  1. 输出文件类型”
  2. 添加 DEM 高程数据”

上传我的文件获取我可以下载所需文件重定向 html 页面的 URL。

我的问题是我找不到下载文件方法

大家有什么建议吗?

先谢谢了。

这是我的代码

    WebClient webClient = new WebClient();
    webClient.getoptions().setCssEnabled(false);
    webClient.getoptions().setJavaScriptEnabled(true);
    webClient.getoptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getoptions().setThrowExceptionOnScriptError(false);
    webClient.getoptions().setRedirectEnabled(true);
    
    

    //fetching the web page
    String url = "https://www.gpsvisualizer.com/map_input?form=googleearth";
    //String url = "https://www.reddit.com/r/scraping/";
    HtmlPage page = webClient.getPage(url);
    
    System.out.println(page.getUrl());
    
    System.out.println(page.getTitleText());
    
    //Select set .kml file
    HtmlSelect selectFileType = (HtmlSelect) page.getElementByName("googleearth_zip");
    System.out.println(selectFileType.getoption(0).asText());
    //System.out.println(selectFileType.getoption(1).asText());
    
    HtmlOption kmlFile = selectFileType.getoptionByText(".kml (uncompressed)");
    System.out.println(kmlFile.asText());
    selectFileType.setSelectedAttribute(kmlFile,true);
    
    //Select add elevation on file
    HtmlSelect selectelevation = (HtmlSelect) page.getElementByName("add_elevation");
    System.out.println(selectelevation.getoption(4).asText());
    
    HtmlOption europeSRTM1 = selectelevation.getoptionByText("NASA SRTM1 (30m res.,NoAm,Europe,more)");
    System.out.println(europeSRTM1.asText());
    selectelevation.setSelectedAttribute(europeSRTM1,true);
    
    //add file
    HtmlForm myForm = page.getFormByName("main");
    HtmlFileInput fileInput = myForm.getInputByName("uploaded_file_1");
    fileInput.setValueAttribute("/media/Stock/Projets/Suratram/Ressources/Traces_WS/puissance/kml_files/01_douce-signoret.kml");
    HtmlElement submitBtn = page.getElementByName("submitted");
    
    //page google
    HtmlPage page2 = submitBtn.click();
    System.out.println(page2.getUrl());

解决方法

因为我没有示例文件,我只能给出一些一般性的建议

HtmlUnit 关于下载有点奇怪 - 通常它是这样工作的:

  • 没有下载 - 每个响应都加载到一个窗口中; HtmlUnit 替换当前窗口的内容或使用 UnknownPage 创建一个新窗口,使内容可用作流。新窗口的决定是根据内容类型(以及一些其他因素,例如锚点的目标)完成的。根据经验,如果真实浏览器显示此下载对话框,您可以期望在新窗口中进行下载。

这是什么意思 - 我猜你的页面会返回一些被 HtmlUnit 检测为单独下载的内容。您可以向 WebClient 询问可用的窗口 (webClient.getWebWindows()),并且在提交/单击之后可能会有一个新窗口(如果异步 js 是游戏的一部分,您可能需要添加一些等待)。这个新窗口将包含一个 UnknownPage 作为封闭页面。你可以向未知页面询问类似这样的响应

Page newPage = newbWin.getEnclosedPage(); // UnknownPage inside window
WebResponse newResponse = newPage.getWebResponse();
try ...                            
    IOUtils.copy(newResponse.getContentAsStream(),outStream);
catch...

作为替代方案,您可以实现一个 WebWindowListener(必须在客户端注册)以便在创建新窗口时收到通知。

希望有所帮助,如果您需要更多,请在 github 上打开一个问题,并提供您的输入文件和代码,以便我重现您的案例。

,

这是我的问题的答案。

按照 HtmlUnit 的文档,我在尝试将下载页面转换为“Webwindow”对象时遇到问题。

HtmlPage page = webClient.getPage(uri);
WebWindow window = page.getEnclosingWindow();

所以最后,我不需要将其转换为“Webwindow”。 只是为了解析“Anchors”以找到我的并捕获“webResponse”以获取处理的文件。

您可以在以下位置找到更多详细信息: https://github.com/HtmlUnit/htmlunit/issues/352

感谢 RBRi 的帮助。

最佳

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...