htmlunit抓取动态网页(创建新浪网站实例通过表达式获取你想获取的标签元素)

优采云 发布时间: 2022-04-14 19:26

  htmlunit抓取动态网页(创建新浪网站实例通过表达式获取你想获取的标签元素)

  本文是我自己对技术的总结描述,不是很官方,可能会有一些问题,欢迎指正

  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 排版

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线