进行抓取页面,我看了一下人家的教程,一般要用到htmlparser用来解析html得到一个网页的相关链接,用httpclient抓取网页数据, 
下面是一我写的spider类 
package com.openzone.search.spider; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.Writer; 
import java.util.HashSet; 
import java.util.Set; 
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpException; 
import org.apache.commons.httpclient.methods.GetMethod; 
import org.apache.commons.httpclient.params.HttpMethodParams; 
import org.htmlparser.Node; 
import org.htmlparser.NodeFilter; 
import org.htmlparser.Parser; 
import org.htmlparser.filters.NodeClassFilter; 
import org.htmlparser.filters.OrFilter; 
import org.htmlparser.lexer.Stream; 
import org.htmlparser.tags.LinkTag; 
import org.htmlparser.util.NodeList; 
import org.htmlparser.util.ParserException; 
public class Spider { 
/** 
* 使用种子初始化url队列 
*/ 
String[] seeds;//种子地址,爬虫首先进入的网页 
String line;//获取相关的链接,比如line="http://localhost",爬虫将只记录以此为开头的地址 
String savepath;//存储网页的文件夹 
String encoding;//爬虫的编码形式 
public Spider(String[] seeds,String line,String savepath,String encoding){ 
this.seeds=seeds; 
this.line=line; 
this.savepath=savepath; 
this.encoding=encoding; 

public void init(){ 
Set<String> seedsSet=new HashSet<String>(); 
for(int i=0;i<seeds.length;i++){ 
seedsSet.add(seeds[i]); 

UrlTables.addToUnvisitedUrlSet(seedsSet); 

public void run() throws HttpException, IOException, ParserException{ 
init(); 
for(int i=0;i<20;i++){ 
if(UrlTables.getUnvisitedUrl().size()!=0){ 
String url=UrlTables.getFirstFromVisitedUrSet(); 
catchPages(url); 
UrlTables.addToVisitedUrlSet(url); 
UrlTables.addToUnvisitedUrlSet(getUrls(url)); 



public void catchPages(String url){ 
String filename=null; 
HttpClient httpClient=new HttpClient(); 
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); 
GetMethod getMethod=new GetMethod(url); 
//生成getmthod对象并设置参数 
//设置get请求超时5s 
getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000); 
//设置请求重试处理 
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
new DefaultHttpMethodRetryHandler()); 
//设置encoding 网页模板
getMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,encoding); 
getMethod.addRequestHeader("Content-Type", "text/html; charset=UTF-8");   
//执行http get请求 
int statusCode; 
try { 
statusCode = httpClient.executeMethod(getMethod); 
System.out.print(statusCode); 
if(statusCode==200){ 
InputStream responseBody=null; 
responseBody=getMethod.getResponseBodyAsStream(); 
filename=getFileNameByUrl(url, getMethod.getResponseHeader("Content-Type").getValue()); 
if(responseBody!=null) 
saveToLocal(responseBody,filename); 
System.out.println("getsuccess"); 
String body=""; 
body=responseBody.toString(); 
System.out.println(body); 
}else{ 
System.out.print("getfalse"); 

} catch (HttpException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 


/* 
* 将catchPages得到的网页的比特流存到本地 
*/ 
public void saveToLocal(InputStream responseBody,String filename) throws IOException{ 
BufferedReader reader = new BufferedReader(new InputStreamReader(responseBody,encoding)); 
File file=new File(savepath,filename); 
FileOutputStream fileOutputStream=new FileOutputStream(file); 
OutputStreamWriter writer=new OutputStreamWriter(fileOutputStream); 
String line; 
while((line=reader.readLine())!=null){ 
System.out.println(line); 
writer.write(line); 

writer.flush(); 
writer.close(); 

/* 
* 解析页面的url 
*/ 
public Set<String> getUrls(String url) throws ParserException{ 
Set<String> links=new HashSet<String>(); 
Parser parser=new Parser(url); 
parser.setEncoding(encoding); 
NodeFilter frameFilter=new NodeFilter() { 
@Override 
public boolean accept(Node node) { 
// TODO Auto-generated method stub 
if(node.getText().startsWith("frame src=")){ 
return true; 
}else{ 
return false; 


}; 
OrFilter linkFilter=new OrFilter(new NodeClassFilter(LinkTag.class),frameFilter); 
NodeList list=parser.extractAllNodesThatMatch(linkFilter); 
for(int i=0;i<list.size();i++){ 
Node tag=list.elementAt(i); 
if(tag instanceof LinkTag){ 
LinkTag link=(LinkTag)tag; 
String linkUrl=link.getLink(); 
if(frameFilter.accept(tag)){ 
//处理<frame> 
String frameTxt=tag.getText(); 
int start=frameTxt.indexOf("src="); 
frameTxt=frameTxt.substring(start); 
int end=frameTxt.indexOf(" "); 
if(end==-1){ 
end=frameTxt.indexOf(">"); 
} http://www.huiyi8.com/moban/​
String frameUrl=frameTxt.substring(5,end-1); 
if(LinkFilter(frameUrl)) 
links.add(frameUrl); 
}else{ 
//处理<a> 
if(LinkFilter(linkUrl)){ 
links.add(linkUrl); 




return links; 

//爬虫遵循的线索 
public boolean LinkFilter(String url){ 
if(url.startsWith(line)){ 
return true; 
}else{ 
return false; 

}

//网页名filter,不然会出现存储错误 
public String getFileNameByUrl(String url,String contentType){ 
//移除http; 
url=url.substring(7); 
//text/html类型 
if(contentType.indexOf("html")!=-1){ 
url=url.replaceAll("[\\?/:*|<>\"]", "_")+".html"; 
return url; 
}else{ 
return url.replaceAll("[\\?/:*|<>\"]","_")+"."+ 
contentType.substring(contentType.lastIndexOf("/")+1); 



//下面是存储地址的类 
package com.openzone.search.spider; 
import java.util.HashSet; 
import java.util.LinkedList; 
import java.util.Set; 
public class UrlTables { 
private static Set<String> visitedUrlSet=new HashSet(); 
private static LinkedList unvisitedUrlSet=new LinkedList(); 
public static Set getVisitedUrl() { 
return visitedUrlSet; 

public static void setVisitedUrl(Set visitedUrl) { 
UrlTables.visitedUrlSet = visitedUrl; 

public static LinkedList getUnvisitedUrl() { 
return unvisitedUrlSet; 

public static void setUnvisitedUrl(LinkedList unvisitedUrl) { 
UrlTables.unvisitedUrlSet = unvisitedUrl; 

public static void addToVisitedUrlSet(String url){ 
visitedUrlSet.add(url); 

public static boolean IsUnvisitedUrlSetEmpty(){ 
boolean isEmpty=false; 
if(unvisitedUrlSet.isEmpty()){ 
isEmpty=true; 

return isEmpty;  

public static void addToUnvisitedUrlSet(Set<String> urls){ 
for (String url : urls) { 
if(!isVisited(url)){ 
unvisitedUrlSet.add(url); 



public static boolean isVisited(String url){ 
boolean isVisited=false; 
for (String visitedUrl : visitedUrlSet) { 
if(visitedUrl.equals(url)){ 
isVisited=true; 


return isVisited; 

public static String getFirstFromVisitedUrSet(){ 
String url=unvisitedUrlSet.getFirst().toString(); 
unvisitedUrlSet.removeFirst(); 
return url; 


//下面实例化爬虫进行工作 
package com.openzone.search.spider; 
import java.io.IOException; 
import org.apache.commons.httpclient.HttpException; 
import org.htmlparser.util.ParserException; 
public class SpiderRun { 
/** 
* @param args 
*/ 
public static void main(String[] args) { 
// TODO Auto-generated method stub 
String[] seeds={"http://localhost/openzone/"}; 
String line="http://localhost"; 
String savepath="D:\\javaworkspace\\openzone"; 
String encoding="utf-8"; 
Spider spider=new Spider(seeds, line, savepath, encoding); 
try { 
spider.run(); 
} catch (HttpException e) { 
e.printStackTrace(); 
// TODO Auto-generated catch block 
} catch (ParserException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 


}

java的一个爬虫的更多相关文章

  1. Java实现一个简单的网络爬虫

    Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...

  2. Java豆瓣电影爬虫——抓取电影详情和电影短评数据

    一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...

  3. Java开发搜索引擎爬虫

    package com.peidon.html; import java.io.BufferedReader; import java.io.File; import java.io.FileOutp ...

  4. 【转】零基础写Java知乎爬虫之进阶篇

    转自:脚本之家 说到爬虫,使用Java本身自带的URLConnection可以实现一些基本的抓取页面的功能,但是对于一些比较高级的功能,比如重定向的处理,HTML标记的去除,仅仅使用URLConnec ...

  5. Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1

    Java之网络爬虫WebCollector2.1.2+selenium2.44+phantomjs2.1.1 一.简介 版本匹配: WebCollector2.12 + selenium2.44.0 ...

  6. java知乎爬虫

    好久没写博客了,前阵子项目忙着上线,现在有点空闲,就把最近写的一个爬虫和大家分享下,统计结果放在了自己买的阿里云服务器上(点此查看效果),效果如下: 程序是在工作之余写的,用了java 的webmgi ...

  7. java简单web爬虫(网页图片)

    java简单web爬虫(网页图片)效果,执行main()方法后图片就下载道C盘的res文件夹中.没有的话创建一个文件夹代码里的常量根据自己的需求修改,代码附到下面. package com.sinit ...

  8. 【网络爬虫】【java】微博爬虫(五):防止爬虫被墙的几个技巧(总结篇)

    爬虫的目的就是大规模地.长时间地获取数据,跟我们正常浏览器获取数据相比,虽然机理相差不大,但总是一个IP去爬网站,大规模集中对服务器访问,时间一长就有可能被拒绝.关于爬虫长时间爬取数据,可能会要求验证 ...

  9. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)

    一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...

随机推荐

  1. [java基础] 001 - 记一次堆栈溢出异常(StackOverFlowError)

    上午经理发来一个任务,解决某个接口异常,此接口第一次调用成功返回: {ret=Y, orderResultList=[{itemno=31920190521083622032, sub_msg=成功, ...

  2. git学习五:eclipse使用git下载项目

    原文:http://blog.csdn.net/u014079773/article/details/51597213 准备工作: 目的:从远程仓库github上down所需的项目 eclipse使用 ...

  3. UIAlertView弹出视图动画效果

    在App设计中为了加强用户体验,我们会常常加入一些友好的动画效果.比如类似UIAlertView弹出的动画效果,由于系统中并没有直接提供类似的动画API,如果我们想要做出一样的效果,那就得深入的研究一 ...

  4. Android 关于view的getLayoutParams().width,getWidth(),getMeasuredWidth();

    习惯了使用xml的布局方式,当动态布局的时候就有许多疑点,记录一下,帮助我这老头一样的记忆力. 网上也有许多解析这getLayoutParams().width,getWidth(),getMeasu ...

  5. ubuntu 配置 django

    安装 安装Apache sudo apt-get install apache2 安装Django 下载Django 安装mod_wsgi sudo apt-get install libapache ...

  6. Frotinet60D IP映射 開放指定端口是實際應用

    有多個外網IP的環境中,在某一部電腦上,如何使用多個外網IP中的某一個?且為使用的Bitcomet開放TCP,TUP特定端口? 1.在本機windows防火墻中"輸入" 和&quo ...

  7. css3 - 动态伪类

    动态伪类分为以下几种: 1. hover(经过) 2. active(点击后) 3. focus(聚焦) - input专用 4. visited(访问后) 使用:

  8. css3 - 层次选择器

    div div { background: orange; } body>div { background: green; } .active+div { background: lime; } ...

  9. javascript 转义函数

    // 字符转义 html2Escape(sHtml) { return sHtml.replace(/[<>&"]/g, function(c) { return { ' ...

  10. Ejb in action(六)——拦截器

    Ejb拦截器可以监听程序中的一个或全部方法.与Struts2中拦截器同名,并且他们都可以实现切面式服务.同一时候也与Spring中的AOP技术类似. 不同的是struts2的拦截器的实现原理是一层一层 ...