htmlunit抓取动态网页(创建新浪网站实例通过表达式获取你想获取的标签元素)
优采云 发布时间: 2022-04-14 19:26htmlunit抓取动态网页(创建新浪网站实例通过表达式获取你想获取的标签元素)
本文是我自己对技术的总结描述,不是很官方,可能会有一些问题,欢迎指正
1. 什么是 HtmlUnit?
HtmlUnit 是一个无界面的浏览器 Java 程序。它为 HTML 文档建模并提供用于调用页面、填写表单、单击链接等的 API。就像您在浏览器中所做的一样。HtmlUnit 有不错的 JavaScript 支持(不断改进),甚至可以使用相当复杂的 Ajax 库来模拟 Chrome、Firefox 或 Internet Explorer 等浏览器,具体取决于配置。HtmlUnit 通常用于测试或从网站检索信息。
2. 它能做什么?
它可以读取页面的所有元素
eg:现在有一个需求,客户给一个.chm描述文件,里面记录了表和字段的关系和注释。现在需要将评论添加到数据库中。首先可以通过工具将chm文件转换成html文件,然后我们可以通过爬取html文件来实现这个功能;
可以模拟用户点击,该功能可以实现登录、跳转页面等;
eg:现在有个需求,客户这边有一个系统,里面有很多数据,但是因为安全问题,我们的系统不能直接连接到它的数据库,所以现在需要显示客户的数据系统实时。做吗?您可以通过爬虫制作“适配器”。其一般原理是当用户点击我们的系统并点击查看“个人信息”时,我们的系统通过爬虫实时获取客户系统页面上的数据,并返回给我们的系统进行展示。.
3. 一般流程
需求:现在想通过Java程序爬取新浪新闻的一些内容
创建新浪实例网站通过表达式4.获取你要获取的标签元素项目代码
.pom 文件
net.sourceforge.htmlunit
htmlunit
2.23
复制代码
项目代码
public class XinLangNews {
public static void main(String args[]) throws Exception {
//创建web客户端
WebClient webClient = new WebClient(BrowserVersion.CHROME);//新建一个模拟谷歌Chrome浏览器的浏览器客户端对象
webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常, 这里选择不需要
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用
webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JS
webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAX
webClient.waitForBackgroundJavaScript(30000);//异步JS执行需要耗时,所以这里线程要阻塞30秒,等待异步JS执行结束
//设置链接地址,并返回网站实例
HtmlPage page = webClient.getPage("https://news.sina.com.cn/");
// 获取里边所有的span
List byXPath = (List) page.getByXPath("//*[@id=\"blk_cNav2_01\"]/div/a/span");
// 遍历所有span并打印出里边的内容
byXPath.forEach((x) -> {
System.out.println(x.getTextContent());
});
}
}
复制代码
注意:运行时控制台可能会出现很多错误,不要慌,这些错误是js在html页面报错
说明:下面三个步骤很重要,可以读取js和ajax动态加载的内容
webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JS
webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAX
webClient.waitForBackgroundJavaScript(30000);//异步JS执行需要耗时,所以这里线程要阻塞30秒,等待异步JS执行结束,具体时间可以根据网页js加载效率动态调整,如果有页面元素获取不到的情况,可能是这里出问题了
复制代码
5. 奇怪的把戏
用HtmlUnit编写爬虫项目时,创建WebClient客户端基本是固定格式。最麻烦的是获取dom元素。这里我将介绍一种非常方便的获取dom元素的方法;这里我通过上述新浪新闻网站的介绍;
先打开chrome,然后回车,按F12打开开发者模式,找到你要获取的页面元素,此时在chrome的Elements模块中选择你要获取的元素,点击“右键”,选择复制-->Copy XPath ,此时获取该元素在整个页面中的xpath路径。图中“滚动”的xpath路径为//[@id="blk_cNav2_01"]/div/a[1]/span,因为我要获取所有span(即滚动、排名、政务等) .),因此您可以将上面复制的xpath路径重写为//[@id="blk_cNav2_01"]/div/a/span,并将a[1]更改为a。,你就完成了。您可以使用此方法快速准确地定位元素
6. 待续
比如Jsoup、WebClient、HttpClient都可以实现页面爬虫的效果,但是它们有什么区别呢?这个文章将在下一期公布;
本文使用 mdnice 排版