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.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();
}
}
/**
* 队列,保存将要访问的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();
}
}
我觉得应该没什么问题了 可是 运行之后什么都没有
求各位大神行行好救救我把
我已经在这卡了好多天了 再这样下去要疯了
----------------解决方案--------------------------------------------------------
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());
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了一个新的 所以一直是空的
----------------解决方案--------------------------------------------------------