HtmlUnit可以解析动态网页,本文这里选取了一个网址(页面需js/ajax动态加载),模拟浏览器操作页面各元素,包括点击获取列表值,主要是掌握了HtmlUnit解析页面元素的主要用法,同时使用POI HSSF将页面解析出来的ul/li标签内容导入到excel表。

本文代码只用来作为HtmlUnit页面解析的参考,因为具体页面有具体信息需要处理。其中对页面如果有级联元素,可以参考,如先选地市再选区域。

package com;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;public class CMHtml {public static ArrayList<String> gAddList=new ArrayList<String>();public static String gQueryURL = "http://xxx";public void spider(String strCity,String strArea,String strAddr){  try {    //创建一个webclientWebClient webClient = new WebClient(BrowserVersion.CHROME);               // 启动JSwebClient.getOptions().setJavaScriptEnabled(true); //忽略ssl认证webClient.getOptions().setUseInsecureSSL(true);//禁用Css,可避免自动二次请求CSS进行渲染webClient.getOptions().setCssEnabled(false);//运行错误时,不抛出异常//webClient.getOptions().setThrowExceptionOnScriptError(false);// 设置Ajax异步//webClient.setAjaxController(new NicelyResynchronizingAjaxController());//获取页面HtmlPage page = webClient.getPage(gQueryURL); webClient.waitForBackgroundJavaScript(10000);//webClient.waitForBackgroundJavaScriptStartingBefore(10000);//判断图形验证码是否弹出,获取i标签节点列表DomNodeList<DomElement> nodelist=page.getElementsByTagName("i");int iCode=0;for(int i=0;i<nodelist.getLength();i++){DomElement domElement = (DomElement)nodelist.get(i);String txt=domElement.asXml();if(txt.indexOf("c_vcode")!=-1){//找出id为c_vcode的i标签iCode=i;break;}         }DomElement domElement = (DomElement)nodelist.get(iCode);if(domElement.asXml().indexOf("display: none;")!=-1){//没弹出//获取返回页面的地址列表div/ul/li标签HtmlDivision divKD=(HtmlDivision)page.getElementById("kd_content"); DomNodeList<HtmlElement> nodeKD=divKD.getElementsByTagName("li");for(int m=0;m<nodeKD.size();m++){HtmlElement heLi=nodeKD.get(m);if(heLi.asText().equals(strCity)){//定位到城市page=(HtmlPage)heLi.click();HtmlDivision divKD1=(HtmlDivision)page.getElementById("kd_content"); DomNodeList<HtmlElement> nodeKD1=divKD1.getElementsByTagName("li");for(int n=0;n<nodeKD1.size();n++){HtmlElement heLi1=nodeKD1.get(n);if(heLi1.asText().equals(strArea)){//定位到区域page=(HtmlPage)heLi1.click();break;}}break;}}//输入具体地址HtmlTextInput kw =(HtmlTextInput)page.getElementByName("kw");kw.setValueAttribute(strAddr);    //获取a标签,提交查询HtmlElement heAnchor =page.getHtmlElementById("srhBtn");HtmlPage retPage = (HtmlPage) heAnchor.click();// 等待JS驱动dom完成获得还原后的网页webClient.waitForBackgroundJavaScript(10000);//获取返回页面的地址列表div/ul/li标签HtmlDivision div=(HtmlDivision)retPage.getElementById("query_result"); DomNodeList<HtmlElement> addNode=div.getElementsByTagName("li");for (int i=0;i<addNode.getLength();i++){HtmlElement heLi=addNode.get(i);gAddList.add(heLi.asText());}       webClient.close();  return;}else{//弹出,重新启动爬虫,避免图形验证码识别webClient.close();//关闭浏览器spider(strCity,strArea,strAddr);return;}           }catch (Exception e) {System.err.println( "Exception: " + e ); }}public void query(String path){try {//获取excel文件POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream(path));//得到Excel工作簿对象    HSSFWorkbook wb = new HSSFWorkbook(fs);  //得到Excel工作表对象    HSSFSheet sheet = wb.getSheetAt(0);//取得有效的行数int rowcount = sheet.getLastRowNum(); //得到Excel工作表的行    for (int i=1;i<=rowcount;i++){ //去掉第一行表头HSSFRow row = sheet.getRow(i);  //得到Excel工作表指定行的单元格    HSSFCell cellCity = row.getCell(0);//获取地市String strCity=cellCity.getStringCellValue();HSSFCell cellArea = row.getCell(1);//获取区域String strArea=cellArea.getStringCellValue(); HSSFCell cellAddr = row.getCell(2);//获取地址String strAddr=cellAddr.getStringCellValue(); //爬虫,返回列表结果spider(strCity,strArea,strAddr);//返回的地址写入excel表for(int j=0;j<gAddList.size();j++){HSSFCell cellRes = row.createCell(j+2+1);cellRes.setCellValue(new HSSFRichTextString(gAddList.get(j)));}gAddList.clear();/*Iterator<String> it = gAddList.iterator();while(it.hasNext()){it.remove();}*/FileOutputStream out=new FileOutputStream(path);out.flush();wb.write(out);out.close();}     wb.close();         fs.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }public static void main(String[] args) {CMHtml lession = new CMHtml();String path=System.getProperty("user.dir")+System.getProperty("file.separator")+"cmbb.xls";//增加文件分隔符,通用windows和linux系统lession.query(path);}
}

HtmlUnit解析动态网页并采集网页列表到Excel相关推荐

  1. php采集网页,phpQuery采集网页实现代码实例

    前言 平时开发中可能遇到一个问题.采集网页,小偷程序等等.各种花式秀正则的话,虽然能体现出geek,但是我觉得做事却不够优雅.采集到的网页说白了也是DOM,jQuery各种优雅地获取节点.幸好,有这个 ...

  2. 网页图片采集-网页图片采集软件免费

    一款免费的网页图片采集软件可以采集网页上的各种图片,每个人都可以采集到各种高清图源.支持任意格式的图片采集,只需要导入链接即可批量采集图片. 还有更多的采集方式:输入关键词全网图片采集/任意网站所有图 ...

  3. beautifulsoup解析动态页面div未展开_实战|Python轻松实现动态网页爬虫(附详细源码)...

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.项目背景事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码)&g ...

  4. 使用htmlunit采集网页+点击网页按钮

    有兴趣可以了解下这款国内人气很旺的JAVA代码生成器基于拖拽,不用写复杂的模板,支持多种数据库,适配wap,管理后台各种功能全有 免费开源 地址:https://blog.csdn.net/adyue ...

  5. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  6. java 动态网页_JavaWeb01-动态网页

    01.动态网页的优势 动态网页是在服务器端运行的程序!随不同用户,不同条件 返回不同的结果! 001.交互性:网页会根据用户的要求和选择而动态的改变和现实网页内容! 002.自动更新:无需改变页面的代 ...

  7. php采集网页 alpha版

    //可以对整个网站的网页进行采集,包括下一页,下一组,采集完所有的页之后,进入下一组....... <?php header("content-type: text/html; ch ...

  8. 动态网页和静态网页之间的区别?

    静态网页和静态网页的区别: 程序是否在服务器端运行,是重要标志.在服务器端运行的程序.网页.组件,属于动态网页,它们会随不同客户.不同时间,返回不同的网页.运行于客户端的程序.网页.插件.组件,属于静 ...

  9. php抓取html元素内容 采集网页

    网页抓取就像搜索引擎一个可以去自动抓取其它服务器上的内容了,下面我整理的几个php常用做法,大家一起来看看. 抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程 ...

最新文章

  1. c# 使用Autodesk design Review API
  2. Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例
  3. 从numpy里加载_PyTorch强化:01.PyTorch 数据加载和处理
  4. (转)shiro权限框架详解05-shiro授权
  5. Javascript七种继承方式
  6. 在 Linux 下搭建 Git 服务器
  7. 如何在Mac上创建和引导Linux USB驱动器
  8. 戴尔G7 7588 Windows 10 未安装任何音频输出设备
  9. 晋南讲堂之持久层框架ORM简介
  10. AndroidStudio插件集合
  11. TP5学习(七):模型
  12. Auto.jsMIUI小米手机锁屏界面无法上滑输入密码解锁的问题 以及如何输入密码进行解锁
  13. 网络诊断显示服务器有问题,Win7系统网络诊断提示DNS服务器未响应怎么解决
  14. 宝塔用ip+端口访问服务器时出现无法访问此网站
  15. 元代家谱上的名字是以数字命名的?这里面蕴含了哪些历史特色?
  16. jstl依赖_[JSTL表达式]
  17. 如何降低自动化维护成本?
  18. XSL中特殊符号详解
  19. 仿生学: 尺度和坐标轴
  20. 试着编写了一下战网的登录页面,刚学会css和html5

热门文章

  1. JVM 内存模型:运行时常量池
  2. c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位
  3. 计算机多媒体技术广泛应用于各个领域,多媒体技术发展前景计算机现状及
  4. python 字符串大小写相关函数
  5. js数组与字符串的相互转换方法
  6. Codeforces Round#433 简要题解
  7. 记ThoughtWorks面试失败之旅
  8. 开发资源库(repositiory)
  9. platform设备驱动全透析
  10. Android列表视图(List View)