如何获取由 Javascript 使用 Java / Webdriver 生成的网页的整个源 html 代码?

Posted

技术标签:

【中文标题】如何获取由 Javascript 使用 Java / Webdriver 生成的网页的整个源 html 代码?【英文标题】:How the get the whole source html code of a webpage that is generated by Javascript using Java / Webdriver? 【发布时间】:2020-07-31 20:41:07 【问题描述】:

我是编程新手,我有一个任务需要解决。我正在尝试使用 Java / Webdriver 方法getPageSource() 获取网页的 html 源代码。问题是,该页面是以某种方式生成的,可能是由 javascript 生成的,所以我得到的结果是只包含页面骨架的 html 代码 - 一个空的表,没有被数据填充。但是,在该 html 代码的最底部有一个像 <script type="text/javascript" src="/x/js/main.c0e805a3.js"></script> 这样的标签。 问题是,我怎样才能强制 Webdriver 运行该 Javascript 并给我结果 - 带有数据的整个源 html。在调用getPageSource() 之前,我已经尝试使用这个(js.executeScript("window.location = '/x/js/main.c0e805a3.js'");),但没有成功。

任何帮助将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

现在有很多设置可以在网页上运行 Java 脚本。我认为最著名的可能是Selenium,因为我认为它已经存在了一段时间。其他包括karatePuppeteer,甚至还有一个叫做Rhino的旧工具。 Puppeteer 是 Google, Inc. 的一个项目,它使用 Java-Script(服务器端 Java-Script,称为 Node.js。他们不喜欢我们在这里比较、对比库。

我还没有时间接触 Selenium,但我一直在编写 HTML 解析器、搜索和更新代码。如果您的唯一目标是加载一个其内容是动态“由 AJAX 调用填充”的页面 - 我的意思是,您只需要在您访问网站网页时通常会看到的 HTML 内容,而且你不关心按钮按下那么我一直使用的那个叫做 Splash 这个工具确实可以让您调用 Java 脚本,但如果您只想查看页面上的 JS 动态加载表格,那么从字面上看,您所要做的就是启动工具,然后添加一个一行到你的程序。

在 Google Cloud Platform 上,这两行代码将启动 Splash 代理服务器。如果您在 AWS (Amazon) 或 Azure (Microsoft) 上编写代码,它可能是相似的。如果您在办公室的本地机器上运行代码,则必须研究如何启动它。

安装 Docker。确保已安装 Docker 版本 >= 17。

拉取图片:

 $ sudo docker pull scrapinghub/splash

启动容器:

$ sudo docker run -it -p 8050:8050 --rm scrapinghub/splash

然后,在您的代码中,您所要做的就是:

// If your original code looked like this:
URL url = new URL("https://en.wikipedia.org/wiki/Christopher_Columbus");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", USER_AGENT);
return new BufferedReader(new InputStreamReader(con.getInputStream()));

将此示例中的第一行代码更改为此,并且(理论上)动态加载的 HTML 表格将在返回 HTML 页面之前自动加载,这些表格使用 onload 页面事件完成。

// Add this line to your methods
String splashProxy = "http://localhost:8050/render.html?url=";
URL url = new URL(splashProxy + "https://en.wikipedia.org/wiki/Christopher_Columbus");

对于大多数网站,任何由 JS/jQuery/AJAX 填充的初始表格都会被填充。如果您愿意学习Lua Programming Language,您也可以开始调用那里的方法。这对我的目的来说非常方便,因为我不是在编写网页测试代码(模拟用户按钮按下的代码)。如果您正在这样做,那么 Selenium 可能值得花时间学习/研究 A.P.I.

【讨论】:

以上是关于如何获取由 Javascript 使用 Java / Webdriver 生成的网页的整个源 html 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium/Python 获取由 JavaScript 编写的 html 内容 [重复]

如何获取由javascript设置的网页的隐藏InnerHtml?

如何获取由 HTML 完成的网络请求列表

如何在 WebBrowser 控件中获取呈现的 html(由 Javascript 处理)?

如何获取由 querySelectorAll() 方法 (javascript) 生成的 DOM 数组的每个元素的索引?

如何获取由群组管理员以外的人上传的 Facebook 群组照片? (通过 JavaScript)