老李分享:网页爬虫java实现
老李分享:网页爬虫java实现
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。
一. 设计思路
(1)一个收集所需网页全站或者指定子域名的链接队列
(2)一个存放将要访问的URL队列(跟上述有点重复, 用空间换时间, 提升爬取速度)
(3)一个保存已访问过URL的数据结构
数据结构有了, 接下来就是算法了, 一般推荐采取广度优先的爬取算法, 免得中了反爬虫的某些循环无限深度的陷阱。
使用了 jsoup (一个解析HTML元素的Lib)和 httpclient (网络请求包)来简化代码实现。
二. 代码实现
上述三种数据结构:
// 已爬取URL <URL, isAccess>
final static ConcurrentHashMap<String, Boolean> urlQueue = new ConcurrentHashMap<String, Boolean>();
// 待爬取URL
final static ConcurrentLinkedDeque<String> urlWaitingQueue = new ConcurrentLinkedDeque<String>();
// 待扫描网页URL队列
final static ConcurrentLinkedDeque<String> urlWaitingScanQueue = new ConcurrentLinkedDeque<String>();
入队等待:
/**
* url store in the waiting queue
* @param originalUrl
* @throws Exception
*/
private static void enterWaitingQueue(final String originalUrl) throws Exception{
String url = urlWaitingScanQueue.poll();
// if accessed, ignore the url
/*while (urlQueue.containsKey(url)) {
url = urlWaitingQueue.poll();
}*/
final String finalUrl = url;
Thread.sleep(600);
new Thread(new Runnable() {
public void run() {
try{
if (finalUrl != null) {
Connection conn = Jsoup.connect(finalUrl);
Document doc = conn.get();
//urlQueue.putIfAbsent(finalUrl, Boolean.TRUE); // accessed
logger.info("扫描网页URL: " + finalUrl);
Elements links = doc.select("a[href]");
for (int linkNum = 0; linkNum < links.size(); linkNum++) {
Element element = links.get(linkNum);
String suburl = element.attr("href");
// 某条件下, 并且原来没访问过
if (!urlQueue.containsKey(suburl)) {
urlWaitingScanQueue.offer(suburl);
urlWaitingQueue.offer(suburl);
logger.info("URL入队等待" + linkNum + ": " + suburl);
}
}
}
}
} catch (Exception ee) {
logger.error("muti thread executing error, url: " + finalUrl, ee);
}
}
}).start();
}
访问页面:
private static void viewPages() throws Exception{
Thread.sleep(500);
new Thread(new Runnable() {
@Override
public void run() {
try {
while(!urlWaitingQueue.isEmpty()) {
String url = urlWaitingQueue.peek();
final String finalUrl = url;
// build a client, like open a browser
CloseableHttpClient httpClient = HttpClients.createDefault();
// create get method, like input url in the browser
//HttpGet httpGet = new HttpGet("http://www.dxy.cn");
HttpPost httpPost = new HttpPost(finalUrl);
StringBuffer stringBuffer = new StringBuffer();
HttpResponse response;
//List<NameValuePair> keyValue = new ArrayList<NameValuePair>();
// Post parameter
// keyValue.add(new BasicNameValuePair("username", "zhu"));
//
// httpPost.setEntity(new UrlEncodedFormEntity(keyValue, "UTF-8"));
// access and get response
response = httpClient.execute(httpPost);
// record access URL
urlQueue.putIfAbsent(finalUrl, Boolean.TRUE);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null) {
logger.info("viewPages访问URL:" + finalUrl);
BufferedReader reader = new BufferedReader(
new InputStreamReader(httpEntity.getContent(), "UTF-8"));
String line = null;
if (httpEntity.getContentLength() > 0) {
stringBuffer = new StringBuffer((int) httpEntity.getContentLength());
while ((line = reader.readLine()) != null) {
stringBuffer.append(line);
}
System.out.println(finalUrl + "内容: " + stringBuffer);
}
}
}
}
} catch (Exception e) {
logger.error("view pages error", e);
}
}
}).start();
}
三. 总结及将来要实现功能
以上贴出了简易版Java爬虫的核心实现模块, 基本上拿起来就能测试。
控制爬取速度(调度模块), 使用代理IP访问(收集网络代理模块)的实现在你可以在自己的版本中会慢慢加上...
老李分享:网页爬虫java实现的更多相关文章
- 老李分享:《Java Performance》笔记1——性能分析基础 1
老李分享:<Java Performance>笔记1——性能分析基础 1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...
- 网页爬虫的设计与实现(Java版)
网页爬虫的设计与实现(Java版) 最近为了练手而且对网页爬虫也挺感兴趣,决定自己写一个网页爬虫程序. 首先看看爬虫都应该有哪些功能. 内容来自(http://www.ibm.com/deve ...
- POPTEST老李分享DOM解析XML之java
POPTEST老李分享DOM解析XML之java Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple ...
- 老李分享:loadrunner的java user脚本开发
老李分享:loadrunner的java user脚本开发 poptest在性能测试loadrunner的课程里,以web协议为主,同时也讲解其他协议的脚本开发,对于一个性能测试工程师需要掌握一个以上 ...
- 老李案例分享:定位JAVA内存溢出
老李案例分享:定位JAVA内存溢出 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培 ...
- java实现网页爬虫
接着上面一篇对爬虫需要的java知识,这一篇目的就是在于网页爬虫的实现,对数据的获取,以便分析. -----> 目录: 1.爬虫原理 2.本地文件数据提取及分析 3.单网页数据的读取 4.运 ...
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- Java正则表达式--网页爬虫
网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据 爬取邮箱地址,爬取的源不同,本地爬取或者是网络爬取 (1)爬取本地数据: public static List<String> ...
- Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱(转)
原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开 ...
随机推荐
- JAVA设计模式:单例设计
1.单例设计Singleton的引出 单例设计,从名字上首先可以看出单---即只有一个,例---只的是实例化对象:那么单例也就是说一个类,只产生了一个实例化对象.但是我们都知道,一个类要产生实例化对象 ...
- MONO 如何打包 .NET程序独立运行(winform篇)
.NET程序独立运行是指运行.NET的电脑上,不需要安装.NET框架. .NET程序集“独立运行”并非真正的独立,它是运行在mono运行时基础之上的.由于这个运行时可以独立存在,所以,我们不需要在目标 ...
- centos快速安装redis
mkdir redis cd redis wget http://labfile.oss.aliyuncs.com/files0422/redis-2.8.9.tar.gz 解压 tar -xvfz ...
- React Native填坑之旅 -- 使用iOS原生视图(高德地图)
在开发React Native的App的时候,你会遇到很多情况是原生的视图组件已经开发好了的.有的是系统的SDK提供的,有的是第三方试图组件,总之你的APP可以直接使用的原生视图是很多的.React ...
- HTML重要标签及属性详解
我学习前端的时间不长,短短1个月而已,只学了些HTML5和CSS3还有少许javascript,另外还有网页布局等等辅助性书籍,我在模仿网页以及完成百度前端技术学院的任务过程中发现了我容易忘记的标签以 ...
- 电器ERP行业案例——环力科技
环力科技ERP案例 企业简介 [规模] 环力公司始建于1992年,是一家专业生产电子压力控制器.水泵压力控制器.气泵压力控制器.电泵浮球控制器.全自动水泵及其它配套产品研究.开发.生产.销售为一体的专 ...
- layer弹出层框架alert与msg详解
ayer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,layer ...
- 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 510 S ...
- 如何快速部署国人开源的 Java 博客系统 Tale
除了闷头专研技术之外,程序员还需要不断地写作进行技术积累,写博客是其中最重要的方式之一.商业博客平台不少,但是更符合程序员背景的方案,是自己开发一个博客平台或者使用开源的博客平台. 开源的博客平台多如 ...
- HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析
HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...