用JAVA实现简单爬虫循环抓取

来源:互联网 发布:酷盛网络加速器 编辑:程序博客网 时间:2024/06/01 19:15

原理:
1.给一个URL,爬虫爬取这个url;
2.url中提取HTML中a 标签内容获取新的url;
3.再通过新的url再循环以上;

实现代码:

import java.io.*;import java.net.*;public class Dome1 {    public static void main(String[] args){    String s1="<a href=\"http://";    String url="http://www.dangdang.com";    String [] urlconntion=new String[50];    Crawler cr=new Crawler(url,s1,urlconntion);    int i=0;    String s2=cr.find();    //相当于DFS算法,如果爬取到最深的url,已无新的url时,则返回最开始的url开始循环;    while(urlconntion[30]==null){        if(s2==null){            cr=new Crawler(url,s1,urlconntion);            s2=cr.find();        }        System.out.println(s2);        cr=new Crawler(s2, s1,urlconntion);        urlconntion[i++]=s2;                s2=cr.find();    }    System.out.println("打印完毕");    }}class Crawler {    String url=null;    String prefix=null;    //爬去过的url地址集合    String[] urlconntion=null;    //爬虫类的构造函数    Crawler(String url,String prefix,String[] urlconntion){        this.url=url;        this.prefix=prefix;        this.urlconntion=urlconntion;    }    //根据类的url开始爬取新的url实现循环爬取    public String find(){        URL u=null;        URLConnection con=null;        BufferedReader bfr=null;        String rpurl=null;        try {            u=new URL(url);            con=u.openConnection();            InputStream is=con.getInputStream();            bfr=new BufferedReader(new InputStreamReader(is));            String s;            while((s=bfr.readLine())!=null){                if(s.indexOf(prefix)>=0)                     {                        rpurl=getUrl(s);                        if(urlrepetition(rpurl)!=-1){                            return rpurl;                        }                     }            }        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            try {                bfr.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        return null;    }    //判断url是否被爬去过,如果被爬去可返回-1,如果没有则返回1    public int urlrepetition(String rpurl){        int i=0;        while(urlconntion[i]!=null){            if(urlconntion[i++].equals(rpurl)){                return -1;            }        }        return 1;    }    //重爬去过的源码中截取url地址;    public String getUrl(String s){        int index1=s.indexOf(prefix);        s=s.substring(index1+9);        int index2=s.indexOf("\"");        s=s.substring(0,index2);        return s;    }}

a标签的内容形式很多,如href=”www.baidu.com” target=”_blank”,我们只需要www.baidu.com,所以我们只需要通过String的,substring函数来截取这部分即可得到新的url并返回。

程序运行结果:
运行图片

存在的问题:
1.通过java获取的网页无法识别中文,出现乱码
2.获取的url内容没判断是否合法或是否能使用,如果url无法使用则程序会出现异常
3.

while((s=bfr.readLine())!=null){                if(s.indexOf(prefix)>=0)                     {                        rpurl=getUrl(s);                        if(urlrepetition(rpurl)!=-1){                            return rpurl;                        }                     }            }

url的源码内容是按行读取的,如果这一行第一个url获取被爬去过了,那么这一行就被跳过去了,无法获取这一行中第二个url。

0 1