数据库
首页 > 数据库> > java-爬虫-14-采用Redis创建url仓库,实现分布式爬虫

java-爬虫-14-采用Redis创建url仓库,实现分布式爬虫

作者:互联网

前言

使用之前单应用的队列仓库存储抓取的url存在以下两个弊端:

  1. 单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取
  2. 在加快爬虫抓取速度时候,我们有时候需要部署多节点,实现多节点抓取,加快抓取速度,但是多节点抓取同一个页面时候,怎样保证哪些url已经抓取了,而不需要再次抓取了,此时如果是单应用队列仓库将会不能区分
  3. 使用redis创建的url仓库(公共的仓库) 恰好解决了这个问题
  4. 多节点可以实现负载均衡,可以保证服务稳定性(其中一个挂掉了,不会对其他有啥影响)

内容

我们本节实现以下功能:Redis实现高低优先级队列

1.集成redis
1.1 maven依赖

https://mvnrepository.com/搜索出redis的jar包依赖

123456
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency>  <groupId>redis.clients</groupId>  <artifactId>jedis</artifactId>  <version>2.9.0</version></dependency>
1.2 编写redis工具类

实现向redis中插入数据,提取数据的工具类

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
   /** * 操作redis数据库的工具类 * @author yxm * @date 2018/11/15 23:04:20 */public class RedisUtil {	/**	 * redis中高优先级	 */	public static String highkey = "spider.highlevel";	/**	 * redis中低优先级	 */	public static String lowkey = "spider.lowlevel";	JedisPool jedisPool = null;	public RedisUtil(){		JedisPoolConfig poolConfig = new JedisPoolConfig();		poolConfig.setMaxId 大专栏  java-爬虫-14-采用Redis创建url仓库,实现分布式爬虫le(10);		poolConfig.setMaxTotal(100);		poolConfig.setMaxWaitMillis(10000);		poolConfig.setTestOnBorrow(true);		jedisPool = new JedisPool(poolConfig, "192.168.20.129", 6379);	}       	/**	 * 查询	 * @param key	 * @param start	 * @param end	 * @return	 */	public List<String> lrange(String key,int start,int end){		Jedis resource = jedisPool.getResource();				List<String> list = resource.lrange(key, start, end);		jedisPool.returnResourceObject(resource);		return list;			}       	/**	 * 添加	 * @param Key	 * @param url	 */	public void add(String Key, String url) {		Jedis resource = jedisPool.getResource();		resource.lpush(Key, url);		jedisPool.returnResourceObject(resource);	}       	/**	 * 获取	 * @param key	 * @return	 */	public String poll(String key) {		Jedis resource = jedisPool.getResource();		String result = resource.rpop(key);		jedisPool.returnResourceObject(resource);		return result;	}		public static void main(String[] args) {		RedisUtil redisUtil = new RedisUtil();		String url = "http://tv.youku.com/search/index/_page40177_1_cmodid_40177";		redisUtil.add(highkey, url);	}}
1.3 启动redis

1.4 定义存储url仓库接口的实现(此时是电视剧的实现)
123456789101112131415161718192021222324
   /** * Redis url仓库实现类 * @author yxm * @date 2018/11/15 23:22:10 */public class RedisRepositoryService implements IRepositoryService {    RedisUtil reidsUtil =  new RedisUtil();    @Override    public String poll() {        String url = reidsUtil.poll(RedisUtil.highkey);        if(StringUtils.isBlank(url)){            url = reidsUtil.poll(RedisUtil.lowkey);        }        return url;    }    @Override    public void addHighLevel(String url) {        reidsUtil.add(RedisUtil.highkey,url);    }    @Override    public void addLowLevel(String url) {        reidsUtil.add(RedisUtil.lowkey,url);    }}
1.5 工程结构

标签:java,String,url,redis,爬虫,resource,RedisUtil,public,14
来源: https://www.cnblogs.com/dajunjun/p/11711043.html