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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章