最近在写一个有关于爬虫的小程序,其实不能算是一个比较复杂的爬虫,只是由于一个数据挖掘的项目需要采集数据,所以就临时写了一个简单的爬虫,下面是我在网上查找了相关的代码和资料之后自己修改的一个,可以用,这算是一个广度优先遍历的爬虫,由于项目需要目前这个爬虫的深度为2,层次更深的爬取程序可能会有一些问题,如重复网址的处理,死循环等等,暂时还在修改当中,至于深度优先遍历的爬虫还没有进行仔细考虑和实现,以后会进行考虑的。
package spider3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.net.*;
import java.io.*;
import java.util.regex.*;
import spider3.HttpTest;
/*
根据指定的规则,通过构造正则表达式获取网址
*/
public class Urls
{
private String startUrl; //开始采集网址
String urlContent;
String ContentArea;
private String strAreaBegin ,strAreaEnd ; //采集区域开始采集字符串和结束采集字符串
String strContent;//获得的采集内容
String[] allUrls; //采集到的所有网址
ArrayList< String> linkList = new ArrayList< String>();
int max=0;
private String regex; //采集规则
/**
* 初始化构造函数 strAreaBegin 和strAreaEnd
* @param strAreaBegin
* @param strAreaEnd
*/
public Urls (String strAreaBegin,String strAreaEnd)
{
this.strAreaBegin=strAreaBegin;
this.strAreaEnd=strAreaEnd;
}
/**
* 获得开始采集网址
* @param startUrl
*/
public void setStartUrl(String startUrl)
{
this.startUrl=startUrl;
// System.out.println("In setStartUrl===:" + startUrl);
}
/**
* 获得网址所在内容;
*/
public void getUrlContent()
{
StringBuffer is=new StringBuffer();
try
{
URL myUrl=new URL(startUrl);
//System.out.println("In getUrlContent===:" + startUrl);
BufferedReader br= new BufferedReader(new InputStreamReader(myUrl.openStream(),"gb2312"));
String s;
while((s=br.readLine())!=null)
{
is.append(s);
//System.out.println(s);
}
urlContent=is.toString();
}
catch(Exception e)
{
System.out.println("网址文件未能输出");
e.printStackTrace();
}
}
/**
* 获得网址所在的匹配区域部分
*/
public void getContentArea()
{
int pos1=0,pos2=0;
pos1= urlContent.indexOf(strAreaBegin)+strAreaBegin.length();
pos2=urlContent.indexOf(strAreaEnd,pos1);
ContentArea=urlContent.substring(pos1,pos2);
}
public void Urls()
{
int i=0;
//String regex ="<a href="?'?http://[a-zA-Z0-9]+/.[a-zA-Z0-9]+/.[a-zA-Z]+/?[/.?[/S|/s]]+[a>]$";
//String regex ="<a.*?/a>";
String regex ="href\\s*=\\s*\"http?(.*?)[\"|>]";
//String regex ="http://.*?>";
Pattern pt=Pattern.compile(regex);
Matcher mt=pt.matcher(ContentArea);
while(mt.find())
{
String link = mt.group().trim();
link = link.replace("href=\"", "");
link = link.replace("\"", "");
System.out.println(link);
i++;
if (link.length() < 1) {
continue;
}
// 跳过链到本页面内链接。
if (link.charAt(0) == '#') {
continue;
}
if (link.charAt(0) == '/') {
continue;
}
if (link.indexOf("mailto:") != -1) {
continue;
}
if (link.toLowerCase().indexOf("javascript") != -1) {
continue;
}
int index = link.indexOf('#');
if (index != -1) {
link = link.substring(0, index);
}
if(link.contains("item"))//符合规则包含特定字符的超链接才记录入链表
{
linkList.add(link);
}
}
System.out.println("共有"+i+"个符合结果");
}
public void content() throws Exception
{
for(int i =1; i<linkList.size();i++)
{
System.out.println("in result========:" + linkList.get(i));
// setStartUrl(linkList.get(i));
// getUrlContent();
// getContentArea();
// Urls();
HttpTest client = new HttpTest(linkList.get(i));
client.run();
max++;
}
System.out.println("处理完成:" + max);
}
//获取url网址
public ArrayList< String> getResult(){
return linkList;
}
public String getRegex()
{
return regex;
}
class UrlAndTitle
{
String myURL;
String title;
}
public static void main(String[] args) throws Exception
{
Urls myurl=new Urls("<body","/body>");
myurl.setStartUrl("http://");
myurl.getUrlContent();
myurl.getContentArea();
myurl.Urls();
System.out.println("------------------------------------------------------------------------");
myurl.content();
}
}