当前位置: 代码迷 >> Java相关 >> Java小菜鸟虚心求教 关于网络爬虫
  详细解决方案

Java小菜鸟虚心求教 关于网络爬虫

热度:345   发布时间:2013-08-26 16:17:54.0
Java小菜鸟虚心求教 关于网络爬虫
    老师让编一个爬虫  编得我意识都模糊了 可是最后就是差一点
    刚不住了  求各位大神指点迷津
    这是主程序:
程序代码:
import java.io.IOException;
import java.util.Set;

public class MyCrawler {
   
    public static void main(String args[]) throws IOException{
      
           
        LinkQueue.addUnvisitedUrl("http://www.baidu.com");
        //循环条件:待抓取的链接不空且抓取的网页不多于100
        while(!LinkQueue.unVisitedUrlsEmpty()
                &&LinkQueue.getVisitedUrlNum()<=100){
            //队头URL出队列
            String visitUrl = (String) LinkQueue.unVisitedUrlDeQueue();
            if(visitUrl==null){
                continue;
            }
            DownPage downpage = new DownPage();
            //下载网页
            String filePath = downpage.downpage(visitUrl);
            //该URL放入已访问的URL中
            LinkQueue.addVisitedUrl(visitUrl);
            //提取出下载网页中的URL
            Set<String> links = collectUrl.collect(filePath);
            //新的未访问的URL入队
            for(String link:links){
                LinkQueue.addUnvisitedUrl(link);
            }
               
        }
    }
   
}

表单我是参照其他书上写的
程序代码:
import java.util.LinkedList;

/**
* 队列,保存将要访问的URL
*/
public class Queue {
    //使用链表实现队列
    private LinkedList<Object> queue = new LinkedList<Object>();
    //入队列
    public void enQueue(Object t){
        queue.addLast(t);
    }
    //出队列
    public Object deQueue(){
        return queue.removeFirst();
    }
    //判断队列是否为空
    public boolean isQueueEmpty(){
        return queue.isEmpty();
    }
    //判断队列是否包含t
    public boolean contains(Object t){
        return queue.contains(t);
    }
    public boolean empty(){
        return queue.isEmpty();
    }
   
}    import java.util.*;

public class LinkQueue {
   
    //已访问的URL集合
    private static Set<String> visitedUrl = new HashSet<String>();
    //待访问的URL集合
    private 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&&url.trim().equals("")
                &&!visitedUrl.contains(url)
                &&!unVisitedUrl.contains(url))
            unVisitedUrl.enQueue(url);
    }
    //获得已经访问的URL数目
    public static int getVisitedUrlNum(){
        return visitedUrl.size();
    }
    //判断未访问的URL队列中是否为空
    public static boolean unVisitedUrlsEmpty(){
        return unVisitedUrl.empty();
    }
   
}

我觉得应该没什么问题了  可是 运行之后什么都没有
求各位大神行行好救救我把  
我已经在这卡了好多天了 再这样下去要疯了
搜索更多相关的解决方案: 主程序  Java  网络  小菜  

----------------解决方案--------------------------------------------------------
debug试试再说。看运行到哪,哪里该有值的没有值
----------------解决方案--------------------------------------------------------
回复 2楼 java小蚂蚁
主要是第一个网址 就是百度主页那个出了问题  我试了试
add进去后直接输出  但是什么都输出不出来
可是没显示任何问题  请问这是怎么了
----------------解决方案--------------------------------------------------------
回复 2楼 java小蚂蚁
主要是第一个网址 就是百度主页那个出了问题  我试了试
add进去后直接输出  但是什么都输出不出来
可是没显示任何问题  请问这是怎么了
----------------解决方案--------------------------------------------------------
没做过这方面的
----------------解决方案--------------------------------------------------------
回复 5楼 java小蚂蚁
好吧
老师真心给我出了个难题哇。。
----------------解决方案--------------------------------------------------------
程序代码:
class LinkQueue  修改

private static Queue unVisitedUrl ;
   

    public static void setq(Queue q){
        unVisitedUrl=q;
    }

main  修改
Queue q= new Queue();
q.enQueue("http://www.baidu.com");
LinkQueue.setq(q);
System.out.println(LinkQueue.getUnVisitedUrl().isQueueEmpty());


----------------解决方案--------------------------------------------------------
回复 7楼 hhwz
谢谢楼主大神
试过代码了 可以解决
我想请教一下 为什么要这样改
我的表单哪里写错了
指出来让我进步吧
谢谢大神
----------------解决方案--------------------------------------------------------
回复 7楼 hhwz
我稍微看懂了一点
是把那个地址加到了Queue的对象去
为什么LinkQueue不行呢
----------------解决方案--------------------------------------------------------
这个不是单例模式的 可能 是每次使用时都new了一个新的 所以一直是空的

----------------解决方案--------------------------------------------------------
  相关解决方案