JAVA編寫網絡爬蟲筆記(第一部分:URL鏈表的結構)

一開始拿到寫爬蟲的任務還是挺迷茫的,沒什麼頭緒,甚至還不知道什麼是爬蟲,要怎樣寫。於是,在網上找到了《自己動手寫爬蟲》的這本書,花了幾天的時間去看,略有小成就。

一、我們要理解一下一個簡單爬蟲實現的原理:通過URL下載網頁代碼並解析找到我們所需要的內容,並通過這網頁上的鏈接訪問其他URL,重複操作。在這裏就要說一下URL是什麼:其實就是我們要訪問的網頁地址(存儲在服務器上的一個文件)。

二、我們分析完原理後,就要設計這個項目的代碼結構了。首先,我們要有一個類來輸入URL然後測試,這個類我寫成了MyCrawler類。第二,既然是要下載網頁的代碼,就要有一個DownloadFile類,功能是給它一個URL,把這個URL的網頁源代碼下載到本地。第三,我們要訪問這個網頁的URL,就要先獲取這個網站上的所有URL,存放到一個未訪問鏈接的表中,並且訪問其中的URL後,就把已訪問的URL放到已訪問鏈表中,下次訪問URL的時候先判斷這個URL是否在未訪問鏈表中,是就訪問,否就跳過並進行下一次訪問,於是就設計了兩個這樣的表:Queue(一個鏈表,裏面有入列,出列,判斷等等方法)和LinkQueue()(裏面有visitedurl和unvisitedurl兩個成員變量和入列,出列,判斷等方法)

三、設計好代碼結構後,就到代碼的具體實現了,第一部分我就把鏈表的結構詳細展示給大家看
Queue.java (把URL保存到鏈表中主要的目的是方便增加,刪除,判斷)


import java.util.LinkedList;


public class Queue {
    /**
     * 隊列,保存將要訪問的URL
     * */
    //使用鏈表實現隊列
    private LinkedList queue =new LinkedList();
    //入隊列
    public void enQueue(Object t){
        queue.addLast(t);
    }
    //出隊列
    public Object deQueue(){
        return queue.removeFirst();
    }

    //判斷隊列是否爲空
    public boolean isQueueEmpty(){
        return queue.isEmpty();
    }
    //判斷隊列是否包含t
    public boolean contians(Object t){
        return queue.contains(t);
    }
    public boolean empty(){
        return queue.isEmpty();
    }


}

LinkQueue.java(把visitedUrl聲明爲HashSet結構是因爲,已訪問的url列表中不存在兩個相同的URL)



import java.util.HashSet;
import java.util.Set;

public class LinkQueue {
        //已訪問的url集合
    public static Set visitedUrl=new HashSet();
    //待訪問的url集合
    public static Queue unVisitedUrl=new Queue();
    //獲得URL隊列
    public static Queue getUnVisitedUrl(){
        return unVisitedUrl;
    }
    //添加到訪問過的URL隊列中
    public static void addVisitedUrl(String url){
        visitedUrl.add(url);
    }
    //移除訪問過的url
    public static void removeVisitedUrl(String url){
        visitedUrl.remove(url);
    }
    //未訪問的URL出隊列
    public static Object unVisitedUrlDeQueue(){
        return unVisitedUrl.deQueue();
    }
    //保證每個URL只被訪問一次
    public static void addUnvisitedUrl(String url){
        if(url!=null &&!visitedUrl.contains(url)&&
                !unVisitedUrl.contians(url)){
            unVisitedUrl.enQueue(url);
        }

    }

    //獲得已經訪問 的URL數目
    public static int getVisitedUrlNum(){
        return visitedUrl.size();
    }
    //判斷未訪問的URL隊列中是否爲空
    public static boolean unVisitedUrlsEmpty(){
        return unVisitedUrl.empty();}
}

關於怎樣通過訪問URL去下載網頁到本地,請留意第二部分。

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