[转载]爬虫的自我解剖(抓取网页HtmlUnit)

news/2024/7/19 10:53:39 标签: 爬虫, java, javascript

网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下:

java">
1
2
3
4
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient webClient= java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">new  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient();
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlPage page=webClient.getPage( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"http://www.yanyulin.info" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">System.out.println(page.asText());
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">webClient.closeAllWindows();

在程序中写上上面的4行代码,运行,就可以得到烟雨林博客首页的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点:

1、HtmlUnitJavascript的支持不是很好

2、HtmlUnitCSS的支持不是很好

明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持滴

java">
1
2
3
4
5
6
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient webClient= java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">new  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient();
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">webClient.getOptions().setCssEnabled( java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">false java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">webClient.getOptions().setJavaScriptEnabled( java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">false java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlPage page=webClient.getPage( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"http://www.yanyulin.info" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">System.out.println(page.asText());
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">webClient.closeAllWindows();

HtmlUnit的使用: 简介:HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript

作用:web的自动化测试(最初的目的),浏览器,网络爬虫

重要API的使用 在介绍API的使用之前要先明白的一个问题是,WebClient,WebWindow,Page三者之间的关系,所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口,三者之间的关系图如下图所示:

1、模拟特定浏览器,也可以指定浏览器的相应版本(HtmlUnit最新版2.13现在可以模拟的浏览器有Chrome/FireFox/IE)

java">
1
2
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//模拟chorme浏览器,其他浏览器请修改BrowserVersion.后面
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient  webClient= java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">new  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient(BrowserVersion.CHROME);

2、查找特定元素,通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子

方法一,通过get方法获取

java">
1
2
3
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlPage page=webClient.getPage( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"http://www.yanyulin.info" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//从[烟雨林博客]上获取标签hed的内容
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlDivision div=(HtmlDivision)page.getElementById( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"hed" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);

方法二,通过XPath获取,XPath通常用于无法通过Id搜索,或者需要更为复杂的搜索时,XPath的相关教程

XPath相关教程请查看我的个人博客

java">
1
2
3
4
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//放入list中,然后获取第一个div
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlDivision div = (HtmlDivision) page.getByXPath( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"//div" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">).get( java value" style="border:0px;color:#009900;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">0 java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">System.out.println(div.asXml());

3、代理服务器的配置,代理的配置很简单,只需要配置好地址,端口,用户名与密码即可

java">
1
2
3
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient webClient = java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">new  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">WebClient(BrowserVersion.CHROME, java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"http://127.0.0.1" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">, java value" style="border:0px;color:#009900;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">8087 java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">credentialsProvider.addCredentials( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"username" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">, java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"password" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);

4、模拟表单的提交

java">
1
2
3
4
5
6
7
8
9
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//获取表单 
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlForm form = page.getFormByName( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"form" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//获取提交按扭
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlSubmitInput button = form.getInputByName( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"submit" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//一会得输入的
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlTextInput textField = form.getInputByName( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"userid" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">textField.setValueAttribute( java string" style="border:0px;color:#0000FF;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">"test" java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">);
java comments" style="border:0px;color:#008200;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">//点击提交表单
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">final  java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">HtmlPage page = button.click();

API的使用就介绍到这,网络爬虫中主要目的就是获取页中所有的链接,代码如下:

java">
1
2
3
4
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">java.util.List<HtmlAnchor> achList=page.getAnchors();
java keyword" style="border:0px;color:#0000ff;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">for java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">(HtmlAnchor ach:achList){
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">System.out.println(ach.getHrefAttribute());
java plain" style="border:0px;line-height:1.8em;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;vertical-align:baseline;">}

最后来个例子,HtmlUnit模拟浏览器登录小米网站帐户,程运运行的截图如下,红色方框表示登录成功跳转到下一个页面出现的帐号:

本博文源代码下载以及相关jar包下载,请到我的个人博客中下载,如果遇到什么问题或本文有什么问题,请到我的个人博客中给我留言

本博文源代码下载:

源码下载

Java皮肤库下载

HtmlUnit源码包下载

HtmlUnit的Jar包下载

本文地址: http://www.yanyulin.info/pages/2013/11/fetchPage.html

转载于:https://www.cnblogs.com/luotinghao/p/3800054.html


http://www.niftyadmin.cn/n/806423.html

相关文章

Flink流批一体计算(10):PyFlink Tabel API

简述 PyFlink 是 Apache Flink 的 Python API&#xff0c;你可以使用它构建可扩展的批处理和流处理任务&#xff0c;例如实时数据处理管道、大规模探索性数据分析、机器学习&#xff08;ML&#xff09;管道和 ETL 处理。 如果你对 Python 和 Pandas 等库已经比较熟悉&#x…

30+顶级互联网公司高薪诚聘 Cocos 人才

除了游戏之外&#xff0c;近年来&#xff0c;Cocos 被应用于越来越多的领域&#xff0c;例如数字娱乐、数字文创、在线教育、虚拟展会、电商等等。Cocos 人才在市场上也拥有更多的就业选择空间&#xff0c;各大招聘网站上&#xff0c;Cocos 岗位需求持续上升。今日&#xff0c;…

分布式搜索引擎Elasticsearch(四):集群搭建与相关知识

Elasticsearch集群 1.集群节点 ELasticsearch的集群是由多个节点组成的&#xff0c;通过cluster.name设置集群名称&#xff0c;并且用于区分其它的集群&#xff0c;每个节点通过node.name指定节点的名称。在Elasticsearch中&#xff0c;节点的类型主要有4种&#xff1a; mast…

设计模式六大原则(2):里氏替换原则(转载)

肯定有不少人跟我刚看到这项原则的时候一样&#xff0c;对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年&#xff0c;由麻省理工学院的一位姓里的女士&#xff08;Barbara Liskov&#xff09;提出来的。 定义1&#xff1a;如果对每一个类型为 T1的对象 o1&#…

【辟谷】第1天|下半部

1四大控件之-标签2四大控件之-按钮&音频4引擎内置组件&作业

ElasticStack技术栈(一):Filebeat、Metricbeat

Beats Filebeat 轻量型日志记录器 基础 1.部署与运行 下载 filebeat-6.5.4-linux-x86_64.tar 链接&#xff1a;https://pan.baidu.com/s/1sIwZgSD9tNQPNuGPYGjGNA 提取码&#xff1a;khvr 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 上传到 /data/beats/ 并…

ElasticStack技术栈(二):Kibana、Logstash

Kibana 安装 windows环境 安装node环境&#xff08;kibana要有node环境&#xff09; 下载node的msi安装文件&#xff08;https://nodejs.org/en/&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1l6UVjO_70rXVXGSDy1kWOA 提取码&#xff1a;xofu 复制这段内容后打开百…

【辟谷】第1天|上半部

1大话场景编辑2四大控件之—精灵&#xff08;上&#xff09;3四大控件之—精灵&#xff08;下&#xff09;