Java网络爬虫(十)--使用redis数据库构建爬虫队列

来源:互联网 发布:大众奥迪编程 编辑:程序博客网 时间:2024/06/06 10:54

代码思想主要是广度优先搜索,有不了解的同学可以下去了解一下算法思想,我们直接来看代码:

redis数据库爬虫队列代码:

package redisqueue;import redis.clients.jedis.Jedis;/** * Created by hg_yi on 17-6-12. */public class RedisQueue {    private Jedis jedis = null;    //本地redis数据库链接服务    public RedisQueue() {        //连接本地的 Redis 服务        jedis = new Jedis("127.0.0.1", 6379);        //权限认证        jedis.auth("******");    }    //将未访问的url加入到toVisit表中(使用的是尾插法)    public void addToVisit(String url) {        jedis.rpush("toVisit", url);    }    //将未访问的url弹出进行解析    public String getToVisit() {        return jedis.lpop("toVisit");    }    //将已经解析过的url添加到已访问队列中    public void addVisited(String url) {        jedis.rpush("visited", url);    }    //判断待访问url队列是否为空    public boolean toVisitIsEmpty() {        Long length = jedis.llen("toVisit");        if (length == 0) {            return true;        } else {            return false;        }    }}

主方法:

package redisqueue;import mainclassify.MainClassifyUrl;import java.util.Set;/** * Created by hg_yi on 17-6-12. * * 使用Jedis进行Redis数据库的操作 */public class MainMethod {    public static void main(String[] args) {        RedisQueue redisQueue = new RedisQueue();        //拿到种子链接(后面是我自己写的一个类,里面包含了种子url)        Set<String> strings = MainClassifyUrl.getMainClassifyUrl();        //将种子链接写进redis数据库的待抓取列表        for (String url : strings) {            redisQueue.addToVisit(url);        }        //使用类似广度优先搜索的思想进行新的url的提取        while (!redisQueue.toVisitIsEmpty()) {            //从待访问url队列中取得一个新的url            String url = redisQueue.getToVisit();            /**             * 判断此url是否还可提取出新的url链接,如果可以进行新链接的提取,             * 如果不行则放弃此节点,并将此节点放入已爬取队列中。             *             * 当前如果使用上一节讲到的布隆过滤还可以实现海量url的去重。             *             * 我们现在只说此url还可以进行提取的情况。             */            //使用jsoup提取新的url链接,并将其加入redis数据中的待访问url队列            //将已经访问过的url加入已访问url队列中            redisQueue.addVisited(url);        }    }}