有关爬虫的

  
         最近在写一个有关于爬虫的小程序,其实不能算是一个比较复杂的爬虫,只是由于一个数据挖掘的项目需要采集数据,所以就临时写了一个简单的爬虫,下面是我在网上查找了相关的代码和资料之后自己修改的一个,可以用,这算是一个广度优先遍历的爬虫,由于项目需要目前这个爬虫的深度为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();
 
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值