热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

前言使用之前单应用的队列仓库存储抓取的url存在以下两个弊端:单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取在加快爬虫抓取速度

前言

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



  1. 单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取

  2. 在加快爬虫抓取速度时候,我们有时候需要部署多节点,实现多节点抓取,加快抓取速度,但是多节点抓取同一个页面时候,怎样保证哪些url已经抓取了,而不需要再次抓取了,此时如果是单应用队列仓库将会不能区分

  3. 使用redis创建的url仓库(公共的仓库) 恰好解决了这个问题

  4. 多节点可以实现负载均衡,可以保证服务稳定性(其中一个挂掉了,不会对其他有啥影响)


内容

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


1.集成redis
1.1 maven依赖

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

123456

redis.clients jedis 2.9.0


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 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 工程结构



推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
author-avatar
丫头2502892725
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有