当前位置: 首页 > news >正文

Java 网页抓取 工具类

现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎、资讯采集、舆情监测等等,诸如此类。网络爬虫涉及到的技术(算法/策略)广而复杂,如网页获取、网页跟踪、网页分析、网页搜索、网页评级和结构/非结构化数据抽取以及后期更细粒度的数据挖掘等方方面面,对于新手来说,不是一朝一夕便能完全掌握且熟练应用的,对于作者来说,更无法在一篇文章内就将其说清楚。因此在本篇文章中,我们仅将视线聚焦在网络爬虫的最基础技术——网页抓取方面。

说到网页抓取,往往有两个点是不得不说的,首先是网页编码的识别,另外一个是对网页脚本运行的支持,除此之外,是否支持以POST方式提交请求和支持自动的cookie管理也是很多人所关注的重要方面。其实Java世界里,已经有很多开源的组件来支持各种各样方式的网页抓取了,包括上面提到的四个重点,所以说使用Java做网页抓取还是比较容易的。下面,作者将重点介绍其中的六种方式。

HttpClient
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器

(5)支持自动的Cookies管理等

Java爬虫开发中应用最多的一种网页获取技术,速度和性能一流,在功能支持方面显得较为底层,不支持JS脚本执行和CSS解析、渲染等准浏览器功能,推荐用于需要快速获取网页而无需解析脚本和CSS的场景。

范例代码如下:

Java代码  
  1. package cn.ysh.studio.crawler.httpclient;  
  2.   
  3. import org.apache.http.client.HttpClient;  
  4. import org.apache.http.client.ResponseHandler;  
  5. import org.apache.http.client.methods.HttpGet;  
  6. import org.apache.http.impl.client.BasicResponseHandler;  
  7. import org.apache.http.impl.client.DefaultHttpClient;  
  8.   
  9. /** 
  10.  * 基于HtmlClient抓取网页内容 
  11.  * 
  12.  * @author www.yshjava.cn 
  13.  */  
  14. public class HttpClientTest {  
  15.   
  16.     public static void main(String[] args) throws Exception {  
  17.         //目标页面  
  18.         String url = "http://www.yshjava.cn";  
  19.         //创建一个默认的HttpClient  
  20.         HttpClient httpclient = new DefaultHttpClient();  
  21.         try {  
  22.             //以get方式请求网页http://www.yshjava.cn  
  23.             HttpGet httpget = new HttpGet(url);  
  24.             //打印请求地址  
  25.             System.out.println("executing request " + httpget.getURI());  
  26.             //创建响应处理器处理服务器响应内容  
  27.             ResponseHandlerresponseHandler = new BasicResponseHandler();  
  28.             //执行请求并获取结果  
  29.             String responseBody = httpclient.execute(httpget, responseHandler);  
  30.             System.out.println("----------------------------------------");  
  31.             System.out.println(responseBody);  
  32.             System.out.println("----------------------------------------");  
  33.         } finally {  
  34.             //关闭连接管理器  
  35.             httpclient.getConnectionManager().shutdown();  
  36.         }  
  37.   
  38.     }  
  39. }  

 

 

 

Jsoup
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

网页获取和解析速度飞快,推荐使用。
主要功能如下:
1. 从一个URL,文件或字符串中解析HTML;
2. 使用DOM或CSS选择器来查找、取出数据;
3. 可操作HTML元素、属性、文本;

范例代码如下:

Java代码  
  1. package cn.ysh.studio.crawler.jsoup;  
  2.   
  3. import java.io.IOException;  
  4. import org.jsoup.Jsoup;  
  5.   
  6. /** 
  7.  * 基于Jsoup抓取网页内容 
  8.  * @author www.yshjava.cn 
  9.  */  
  10. public class JsoupTest {  
  11.   
  12.     public static void main(String[] args) throws IOException {  
  13.         //目标页面  
  14.         String url = "http://www.yshjava.cn";  
  15.         //使用Jsoup连接目标页面,并执行请求,获取服务器响应内容  
  16.         String html = Jsoup.connect(url).execute().body();  
  17.         //打印页面内容  
  18.         System.out.println(html);  
  19.     }  
  20. }  

 

 

HtmlUnit
htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。采用的是Rhinojs引擎。模拟js运行。

网页获取和解析速度较快,性能较好,推荐用于需要解析网页脚本的应用场景。

范例代码如下:

Java代码 
  1. package cn.ysh.studio.crawler.htmlunit;  
  2.   
  3. import com.gargoylesoftware.htmlunit.BrowserVersion;  
  4. import com.gargoylesoftware.htmlunit.Page;  
  5. import com.gargoylesoftware.htmlunit.WebClient;  
  6.   
  7. /** 
  8.  * 基于HtmlUnit抓取网页内容 
  9.  * 
  10.  * @author www.yshjava.cn 
  11.  */  
  12. public class HtmlUnitSpider {  
  13.   
  14.     public static void main(String[] s) throws Exception {  
  15.         //目标网页  
  16.         String url = "http://www.yshjava.cn";  
  17.         //模拟特定浏览器FIREFOX_3  
  18.         WebClient spider = new WebClient(BrowserVersion.FIREFOX_3);  
  19.         //获取目标网页  
  20.         Page page = spider.getPage(url);  
  21.         //打印网页内容  
  22.         System.out.println(page.getWebResponse().getContentAsString());  
  23.         //关闭所有窗口  
  24.         spider.closeAllWindows();  
  25.     }  
  26. }  

 

 

Watij

Watij(发音wattage)是一个使用Java开发的Web应用程序测试工具,鉴于Watij的简单性和Java语言的强大能力,Watij能够使您在真正的浏览器中完成Web应用程序的自动化测试。因为是调用本地浏览器,因此支持CSS渲染和JS执行。

网页获取速度一般,IE版本过低(6/7)时可能会引发内存泄露。

范例代码如下:

Java代码 
  1. package cn.ysh.studio.crawler.ie;  
  2.   
  3. import watij.runtime.ie.IE;  
  4.   
  5. /** 
  6.  * 基于Watij抓取网页内容,仅限Windows平台 
  7.  * 
  8.  * @author www.yshjava.cn 
  9.  */  
  10. public class WatijTest {  
  11.   
  12.     public static void main(String[] s) {  
  13.         //目标页面  
  14.         String url = "http://www.yshjava.cn";  
  15.         //实例化IE浏览器对象  
  16.         IE ie = new IE();  
  17.         try {  
  18.             //启动浏览器  
  19.             ie.start();  
  20.             //转到目标网页  
  21.             ie.goTo(url);  
  22.             //等待网页加载就绪  
  23.             ie.waitUntilReady();  
  24.             //打印页面内容  
  25.             System.out.println(ie.html());  
  26.         } catch (Exception e) {  
  27.             e.printStackTrace();  
  28.         } finally {  
  29.             try {  
  30.                 //关闭IE浏览器  
  31.                 ie.close();  
  32.             } catch (Exception e) {  
  33.             }  
  34.         }  
  35.     }  
  36. }   

 

 

Selenium
Selenium也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建衰退测试检验软件功能和用户需求。支持自动录制动作和自动生成。Net、Java、Perl等不同语言的测试脚本。Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。

网页获取速度较慢,对于爬虫来说,不是一个好的选择。

范例代码如下:

Java代码  
  1. package cn.ysh.studio.crawler.selenium;  
  2.   
  3. import org.openqa.selenium.htmlunit.HtmlUnitDriver;  
  4.   
  5. /** 
  6.  * 基于HtmlDriver抓取网页内容 
  7.  * 
  8.  * @author www.yshjava.cn 
  9.  */  
  10. public class HtmlDriverTest {  
  11.   
  12.     public static void main(String[] s) {  
  13.         //目标网页  
  14.         String url = "http://www.yshjava.cn";  
  15.         HtmlUnitDriver driver = new HtmlUnitDriver();  
  16.         try {  
  17.             //禁用JS脚本功能  
  18.             driver.setJavascriptEnabled(false);  
  19.             //打开目标网页  
  20.             driver.get(url);  
  21.             //获取当前网页源码  
  22.             String html = driver.getPageSource();  
  23.             //打印网页源码  
  24.             System.out.println(html);  
  25.         } catch (Exception e) {  
  26.             //打印堆栈信息  
  27.             e.printStackTrace();  
  28.         } finally {  
  29.             try {  
  30.                 //关闭并退出  
  31.                 driver.close();  
  32.                 driver.quit();  
  33.             } catch (Exception e) {  
  34.             }  
  35.         }  
  36.     }  
  37. }  

 

 

Webspec

一个开源的带有界面的Java浏览器,支持脚本执行和CSS渲染。速度一般。
范例代码如下:

Java代码 
  1. package cn.ysh.studio.crawler.webspec;  
  2.   
  3. import org.watij.webspec.dsl.WebSpec;  
  4.   
  5. /** 
  6.  * 基于WebSpec抓取网页内容 
  7.  * 
  8.  * @author www.yshjava.cn 
  9.  */  
  10. public class WebspecTest {  
  11.   
  12.     public static void main(String[] s) {  
  13.         //目标网页  
  14.         String url = "http://www.yshjava.cn";  
  15.         //实例化浏览器对象  
  16.         WebSpec spec = new WebSpec().mozilla();  
  17.         //隐藏浏览器窗体  
  18.         spec.hide();  
  19.         //打开目标页面  
  20.         spec.open(url);  
  21.         //打印网页源码  
  22.         System.out.println(spec.source());  
  23.         //关闭所有窗口  
  24.         spec.closeAll();  
  25.     }  
  26. }  

 

 

原创文章,转载请注明出处:https://blog.csdn.net/limm33/article/details/78811165

转载于:https://www.cnblogs.com/lnthz/p/9645543.html

相关文章:

  • htmlUnil-2.33 jar包
  • WCF学习总结
  • javascript模拟鸟群使用cax和threejs渲染引擎
  • 18-07-31
  • Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题...
  • QM课程03-采购中的质量管理
  • win7 wamp 64位 php环境如何开启curl服务?
  • ZOJ3765 Lights Splay树
  • 4个实用的微服务测试策略
  • float,double和decimal类型
  • iOS:高仿闲鱼、京东等列表底部分页视图
  • 使用MDI 和 XtraTabbedMdiManager 后 选项卡切换后Ribbon 合并后不选中MDI子窗...
  • java~springboot~ibatis Invalid bound statement (not found)原因
  • c#正则表达式
  • 解码 | 25 分钟开发分布式架构的转账小程序
  • Git初体验
  • JavaScript 基础知识 - 入门篇(一)
  • log4j2输出到kafka
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • mysql外键的使用
  • React-Native - 收藏集 - 掘金
  • SegmentFault 2015 Top Rank
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Vue官网教程学习过程中值得记录的一些事情
  • Zsh 开发指南(第十四篇 文件读写)
  • 简单数学运算程序(不定期更新)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 三栏布局总结
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我看到的前端
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Android开发者必备:推荐一款助力开发的开源APP
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • #ifdef 的技巧用法
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (C语言)字符分类函数
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • ***监测系统的构建(chkrootkit )
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net mvc 获取url中controller和action
  • .NET 反射 Reflect
  • .NET简谈设计模式之(单件模式)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .net与java建立WebService再互相调用