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

1
2
3
4
final WebClient webClient=new WebClient();
final HtmlPage page=webClient.getPage("http://www.yanyulin.info");
System.out.println(page.asText());
webClient.closeAllWindows();

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

1、HtmlUnitJavascript的支持不是很好

2、HtmlUnitCSS的支持不是很好

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

1
2
3
4
5
6
final WebClient webClient=new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
final HtmlPage page=webClient.getPage("http://www.yanyulin.info");
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
HtmlPage page=webClient.getPage("http://www.yanyulin.info");
//从[烟雨林博客]上获取标签hed的内容
HtmlDivision div=(HtmlDivision)page.getElementById("hed");

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

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 WebClient webClient = new WebClient(BrowserVersion.CHROME,"http://127.0.0.1",8087);
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包下载,请到我的个人博客中下载,如果遇到什么问题或本文有什么问题,请到我的个人博客中给我留言

本博文源代码下载:

源码下载

Java皮肤库下载

HtmlUnit源码包下载

HtmlUnit的Jar包下载

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

[转载]爬虫的自我解剖(抓取网页HtmlUnit)的更多相关文章

  1. 爬虫的自我解剖(抓取网页HtmlUnit)

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

  2. 网络爬虫-使用Python抓取网页数据

    搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...

  3. [Python]网络爬虫(一):抓取网页的含义和URL基本构成

    一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个 ...

  4. C语言Linix服务器网络爬虫项目(二)项目设计和通过一个http请求抓取网页的简单实现

    我们通过上一篇了解了爬虫具体要实现的工作之后,我们分析得出的网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子URL: 2.将这些URL放入待抓取URL队列: 3.从待抓取URL队列中取出 ...

  5. Python3简单爬虫抓取网页图片

    现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2), 所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到 ...

  6. Python爬虫练习(多线程,进程,协程抓取网页)

    详情点我跳转 关注公众号"轻松学编程"了解更多. 一.多线程抓取网页 流程:a.设置种子url b.获取区域列表 c.循环区域列表 d.创建线程获取页面数据 e.启动线程 impo ...

  7. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  8. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

    通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...

  9. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

随机推荐

  1. CSS之A标签

    a标签,超级链接 a是英语anchor锚的意思. a标签常用的就是三个属性: 1        <a href="网址" title="悬停文本" tar ...

  2. Jquery的 each的使用 $.each()

    下面提一下each的几种常用的用法 1.each处理一维数组 var arr1 = [ "aaa", "bbb", "ccc" ]; $.e ...

  3. PHP 流程管理

    添加新流程页面: <div> 请选择流程节点:<br /><br /> <?php session_start(); include("../DBD ...

  4. session 和 cookie区别

    1.存在位置cookie是储存在客服端,session是存在服务器端的文件系统/数据库/memcache  2.安全性 session是储存在服务器端,安全性高一些, 3.网络传输量 cookie通过 ...

  5. mysql命令总结

    统计全库数据量: use information_schema; SELECT TABLE_NAME, (DATA_LENGTH) as DataM , (INDEX_LENGTH) as Index ...

  6. 【转载】Java反射: 数组

    原创链接:http://czj4451.iteye.com/blog/1479486 java.lang.reflect.Array Java反射机制通过Array类来处理数组,结合java.lang ...

  7. Fedora 24 Gnome Boxes 无法ping通网络

    安装Fedora 24在试用虚拟机时发现无法ping通外网. 我傻傻地以为是软件问题. 问题描述: 尝试ping程序来测试网络连通性: (我之前也是ping百度,后来在为了少打字百度了一些比较短的域名 ...

  8. %我的 tex 模版

    %我的 tex 模版 \documentclass[UTF8,a1paper,landscape]{ctexart}%UTF8 中文支持,a1paper 纸张大小,landscape 横向版面,cte ...

  9. tyvj1148 小船弯弯

    描述 童年的我们,充满了新奇的想法.这天,小朋友们用彩虹画笔在云霞上绘制了世界上最美丽的图画.那描绘的是一条大河波浪宽,风吹稻花香两岸的情景.欣赏着自己的作品,小朋友们别提多开心了.这时,Q小朋友对C ...

  10. espcms列表页ajax无限加载

    类似百度图片的效果,滚动到底部后,点击加载更多,加载出第二页,第三页... 替代了传统的上一页,下一页,第几页,以达到在某些情况下使得用户体验更好. 二次开发方法: 1.先在模板文件中增加ajax文件 ...