[转载]爬虫的自我解剖(抓取网页HtmlUnit)
网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit
包,4行代码就OK啦,例子如下:
1
2
3
4
|
final WebClient webClient= new WebClient(); System.out.println(page.asText()); webClient.closeAllWindows(); |
在程序中写上上面的4行代码,运行,就可以得到烟雨林博客首页的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点:
1、HtmlUnit
对Javascript
的支持不是很好
2、HtmlUnit
对CSS
的支持不是很好
明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持滴
1
2
3
4
5
6
|
final WebClient webClient= new WebClient(); webClient.getOptions().setCssEnabled( false ); webClient.getOptions().setJavaScriptEnabled( false ); System.out.println(page.asText()); 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
)
1
2
|
//模拟chorme浏览器,其他浏览器请修改BrowserVersion.后面 WebClient webClient= new WebClient(BrowserVersion.CHROME); |
2、查找特定元素,通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子
方法一,通过get方法获取
1
2
3
|
//从[烟雨林博客]上获取标签hed的内容 HtmlDivision div=(HtmlDivision)page.getElementById( "hed" ); |
方法二,通过XPath获取,XPath通常用于无法通过Id搜索,或者需要更为复杂的搜索时,XPath的相关教程
1
2
3
4
|
//同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div //放入list中,然后获取第一个div final HtmlDivision div = (HtmlDivision) page.getByXPath( "//div" ).get( 0 ); System.out.println(div.asXml()); |
3、代理服务器的配置,代理的配置很简单,只需要配置好地址,端口,用户名与密码即可
1
2
3
|
final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider(); credentialsProvider.addCredentials( "username" , "password" ); |
4、模拟表单的提交
1
2
3
4
5
6
7
8
9
|
//获取表单 final HtmlForm form = page.getFormByName( "form" ); //获取提交按扭 final HtmlSubmitInput button = form.getInputByName( "submit" ); //一会得输入的 final HtmlTextInput textField = form.getInputByName( "userid" ); textField.setValueAttribute( "test" ); //点击提交表单 final HtmlPage page = button.click(); |
API的使用就介绍到这,网络爬虫中主要目的就是获取页中所有的链接,代码如下:
1
2
3
4
|
java.util.List<HtmlAnchor> achList=page.getAnchors(); for (HtmlAnchor ach:achList){ System.out.println(ach.getHrefAttribute()); } |
最后来个例子,HtmlUnit模拟浏览器登录小米网站帐户
,程运运行的截图如下,红色方框
表示登录成功跳转到下一个页面出现的帐号:
本博文源代码下载以及相关jar包下载,请到我的个人博客中下载,如果遇到什么问题或本文有什么问题,请到我的个人博客中给我留言
本博文源代码下载:
本文地址: http://www.yanyulin.info/pages/2013/11/fetchPage.html
[转载]爬虫的自我解剖(抓取网页HtmlUnit)的更多相关文章
- 爬虫的自我解剖(抓取网页HtmlUnit)
网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源`HtmlUnit`包,4行代码就OK啦,例子如下: final WebClient webClient=new ...
- 网络爬虫-使用Python抓取网页数据
搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...
- [Python]网络爬虫(一):抓取网页的含义和URL基本构成
一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个 ...
- C语言Linix服务器网络爬虫项目(二)项目设计和通过一个http请求抓取网页的简单实现
我们通过上一篇了解了爬虫具体要实现的工作之后,我们分析得出的网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出 ...
- Python3简单爬虫抓取网页图片
现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2), 所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到 ...
- Python爬虫练习(多线程,进程,协程抓取网页)
详情点我跳转 关注公众号"轻松学编程"了解更多. 一.多线程抓取网页 流程:a.设置种子url b.获取区域列表 c.循环区域列表 d.创建线程获取页面数据 e.启动线程 impo ...
- Python爬虫实战六之抓取爱问知识人问题并保存至数据库
大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格
通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...
- iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据
网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...
随机推荐
- bzoj1835[ZJOI2010]base基站选址
据说正解是什么线段树优化DP,但是作为脑子有坑选手,我们需要5k的做法: 主席树+决策单调性..... F[m][i]表示已经放置了m个基站,第m个基站放置在第i个村庄,第i个村庄及之前的村庄的总最少 ...
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
- 关于Scala的一些感想(一)
最近在完成自己的开源项目Application-center的时候,使用了Scala编程语言. 在使用了一段时间下来以后,有一些不是很"清晰"的感受,说实话我自己还没有很好的整理清 ...
- mysql安装和配置
一.下载mysql mysql下载页 我用的是5.6,点击旁边的"Looking for previous GA versions?"按钮就能看到5.6版本 mysql-5.6.3 ...
- kail linux安装软件提示“无法定位软件包”解决方法
主要是更新源的问题,我安装ibus-pinyin老是提示"无法定位软件包" 最后我用的是163的源: # 源 deb http://mirrors.163.com/debian w ...
- 查看修改Linux时区和时间
查看/修改Linux时区和时间 一.时区 1. 查看当前时区 date -R 2. 修改设置时区 方法(1) tzselect 方法(2) 仅限于RedHat Linux 和 CentOS timec ...
- SqlServer 产生随机数
ALTER PROCEDURE [dbo].[usp_RandomNumber] ( , --随机数位数 --随机笔数 ) AS BEGIN DECLARE @T AS TABLE([Random N ...
- 数据导入导出Oracle数据库
临近春节,接到了一个导入数据的任务,在Linux客户端中的数据有50G,大约3亿3千万行: 刚开始很天真,把原始的txt/csv文件用sh脚本转化成了oralce 的insert into 语句,然后 ...
- 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束
简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...
- Bash 4.4 中新增的 ${parameter@operator} 语法
Bash 4.4 中新增了一种 ${...} 语法,长这样:${parameter@operator}.根据不同的 operator,它展开后的值可能是 parameter 这个参数的值经过某种转换后 ...