用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。

發佈了26 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章