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


    原理:
    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。

  • 相关阅读:
    第二阶段总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    开学总结
  • 原文地址:https://www.cnblogs.com/yankang/p/6399040.html
Copyright © 2020-2023  润新知