java爬虫程序 博客园_java搜索---网络爬虫实现

View Code

packagecom.sreach.spider;

importjava.io.BufferedWriter;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.io.OutputStreamWriter;

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclassFunctionUtils

{

/**

* 匹配超链接的正则表达式

*/

privatestaticString pat ="http://www\\.oschina\\.net/code/explore/.*/\\w+\\.[a-zA-Z]+";

privatestaticPattern pattern = Pattern.compile(pat);

privatestaticBufferedWriter writer =null;

/**

* 爬虫搜索深度

*/

publicstaticintdepth =0;

/**

* 以"/"来分割URL,获得超链接的元素

*

* @param url

* @return

*/

publicstaticString[] divUrl(String url)

{

returnurl.split("/");

}

/**

* 判断是否创建文件

*

* @param url

* @return

*/

publicstaticbooleanisCreateFile(String url)

{

Matcher matcher = pattern.matcher(url);

returnmatcher.matches();

}

/**

* 创建对应文件

*

* @param content

* @param urlPath

*/

publicstaticvoidcreateFile(String content, String urlPath)

{

/* 分割url */

String[] elems = divUrl(urlPath);

StringBuffer path =newStringBuffer();

File file =null;

for(inti =1; i 

{

if(i != elems.length -1)

{

path.append(elems[i]);

path.append(File.separator);

file =newFile("D:"+ File.separator + path.toString());

}

if(i == elems.length -1)

{

Pattern pattern = Pattern.compile("\\w+\\.[a-zA-Z]+");

Matcher matcher = pattern.matcher(elems[i]);

if((matcher.matches()))

{

if(!file.exists())

{

file.mkdirs();

}

String[] fileName = elems[i].split("\\.");

file =newFile("D:"+ File.separator + path.toString()

+ File.separator + fileName[0] +".txt");

try

{

file.createNewFile();

writer =newBufferedWriter(newOutputStreamWriter(

newFileOutputStream(file)));

writer.write(content);

writer.flush();

writer.close();

System.out.println("创建文件成功");

}catch(IOException e)

{

e.printStackTrace();

}

}

}

}

}

/**

* 获取页面的超链接并将其转换为正式的A标签

*

* @param href

* @return

*/

publicstaticString getHrefOfInOut(String href)

{

/* 内外部链接最终转化为完整的链接格式 */

String resultHref =null;

/* 判断是否为外部链接 */

if(href.startsWith("http://"))

{

resultHref = href;

}else

{

/* 如果是内部链接,则补充完整的链接地址,其他的格式忽略不处理,如:a href="#" */

if(href.startsWith("/"))

{

resultHref ="http://www.oschina.net"+ href;

}

}

returnresultHref;

}

/**

* 截取网页网页源文件的目标内容

*

* @param content

* @return

*/

publicstaticString getGoalContent(String content)

{

intsign = content.indexOf("

 
 

String signContent = content.substring(sign);

intstart = signContent.indexOf(">");

intend = signContent.indexOf("

");

returnsignContent.substring(start +1, end);

}

/**

* 检查网页源文件中是否有目标文件

*

* @param content

* @return

*/

publicstaticintisHasGoalContent(String content)

{

returncontent.indexOf("

 
 

}

}

HrefOfPage.java 此类为获取页面的超链接View Code

packagecom.sreach.spider;

publicclassHrefOfPage

{

/**

* 获得页面源代码中超链接

*/

publicstaticvoidgetHrefOfContent(String content)

{

System.out.println("开始");

String[] contents = content.split("

for(inti =1; i 

{

intendHref = contents[i].indexOf("\"");

String aHref = FunctionUtils.getHrefOfInOut(contents[i].substring(

, endHref));

if(aHref !=null)

{

String href = FunctionUtils.getHrefOfInOut(aHref);

if(!UrlQueue.isContains(href)

&& href.indexOf("/code/explore") != -1

&& !VisitedUrlQueue.isContains(href))

{

UrlQueue.addElem(href);

}

}

}

System.out.println(UrlQueue.size() +"--抓取到的连接数");

System.out.println(VisitedUrlQueue.size() +"--已处理的页面数");

}

}

UrlDataHanding.java 此类主要是从未访问队列中获取url,下载页面,分析url,保存已访问url等操作,实现Runnable接口View Code

packagecom.sreach.spider;

publicclassUrlDataHandingimplementsRunnable

{

/**

* 下载对应页面并分析出页面对应的URL放在未访问队列中。

* @param url

*/

publicvoiddataHanding(String url)

{

HrefOfPage.getHrefOfContent(DownloadPage.getContentFormUrl(url));

}

publicvoidrun()

{

while(!UrlQueue.isEmpty())

{

dataHanding(UrlQueue.outElem());

}

}

}

UrlQueue.java 此类主要是用来存放未访问的URL队列View Code

packagecom.sreach.spider;

importjava.util.LinkedList;

publicclassUrlQueue

{

/**超链接队列*/

publicstaticLinkedList urlQueue =newLinkedList();

/**队列中对应最多的超链接数量*/

publicstaticfinalintMAX_SIZE =10000;

publicsynchronizedstaticvoidaddElem(String url)

{

urlQueue.add(url);

}

publicsynchronizedstaticString outElem()

{

returnurlQueue.removeFirst();

}

publicsynchronizedstaticbooleanisEmpty()

{

returnurlQueue.isEmpty();

}

publicstaticintsize()

{

returnurlQueue.size();

}

publicstaticbooleanisContains(String url)

{

returnurlQueue.contains(url);

}

}

VisitedUrlQueue.java 主要是保存已访问过的URL,使用HashSet来保存,主要是考虑到每个访问过的URL是不同。HashSet刚好符合这个要求View Code

packagecom.sreach.spider;

importjava.util.HashSet;

/**

* 已访问url队列

* @author HHZ

*

*/

publicclassVisitedUrlQueue

{

publicstaticHashSet visitedUrlQueue =newHashSet();

publicsynchronizedstaticvoidaddElem(String url)

{

visitedUrlQueue.add(url);

}

publicsynchronizedstaticbooleanisContains(String url)

{

returnvisitedUrlQueue.contains(url);

}

publicsynchronizedstaticintsize()

{

returnvisitedUrlQueue.size();

}

}

Test.java 此类为测试类View Code

importjava.sql.SQLException;

importcom.sreach.spider.UrlDataHanding;

importcom.sreach.spider.UrlQueue;

publicclassTest

{

publicstaticvoidmain(String[] args)throwsSQLException

{

String url ="http://www.oschina.net/code/explore/achartengine/client/AndroidManifest.xml";

String url1 ="http://www.oschina.net/code/explore";

String url2 ="http://www.oschina.net/code/explore/achartengine";

String url3 ="http://www.oschina.net/code/explore/achartengine/client";

UrlQueue.addElem(url);

UrlQueue.addElem(url1);

UrlQueue.addElem(url2);

UrlQueue.addElem(url3);

UrlDataHanding[] url_Handings =newUrlDataHanding[10];

for(inti =0; i <10; i++)

{

url_Handings[i] =newUrlDataHanding();

newThread(url_Handings[i]).start();

}

}

}

说明一下:由于我抓取的是针对oschina的,所以里面的url正则表达式不适合其他网站,需要自己修改一下。你也可以写成xml来配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值