作者:丫头2502892725 | 来源:互联网 | 2023-10-10 17:53
前言使用之前单应用的队列仓库存储抓取的url存在以下两个弊端:单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取在加快爬虫抓取速度
前言 使用之前单应用的队列仓库存储抓取的url存在以下两个弊端:
单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取 在加快爬虫抓取速度时候,我们有时候需要部署多节点,实现多节点抓取,加快抓取速度,但是多节点抓取同一个页面时候,怎样保证哪些url已经抓取了,而不需要再次抓取了,此时如果是单应用队列仓库将会不能区分 使用redis创建的url仓库(公共的仓库) 恰好解决了这个问题 多节点可以实现负载均衡,可以保证服务稳定性(其中一个挂掉了,不会对其他有啥影响) 内容 我们本节实现以下功能:Redis实现高低优先级队列
1.集成redis 1.1 maven依赖 在https://mvnrepository.com/搜索出redis的jar包依赖
123456
redis.clients jedis 2.9.0
实现向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 lrange(String key,int start,int end){ Jedis resource = jedisPool.getResource(); List 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 工程结构