有关爬虫的

来源:互联网 发布:网络信息管理新规 编辑:程序博客网 时间:2024/06/06 15:47
  
         最近在写一个有关于爬虫的小程序,其实不能算是一个比较复杂的爬虫,只是由于一个数据挖掘的项目需要采集数据,所以就临时写了一个简单的爬虫,下面是我在网上查找了相关的代码和资料之后自己修改的一个,可以用,这算是一个广度优先遍历的爬虫,由于项目需要目前这个爬虫的深度为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();     }}

原创粉丝点击