使用Redis实现UA池的方案-创新互联

最近忙于业务开发、交接和游戏,加上碰上了不定时出现的犹豫期和困惑期,荒废学业了一段时间。天冷了,要重新拾起开始下阶段的学习了。之前接触到的一些数据搜索项目,涉及到请求模拟,基于反爬需要使用随机的 User Agent ,于是使用 Redis 实现了一个十分简易的 UA 池。

创新互联公司是一家专业提供吉阳企业网站建设,专注与成都网站建设、成都网站制作H5高端网站建设、小程序制作等业务。10年已为吉阳众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。

背景

最近的一个需求,有模拟请求的逻辑,要求每次请求的请求头中的 User Agent 要满足下面几点:

  • 每次获取的 User Agent 是随机的。
  • 每次获取的 User Agent (短时间内)不能重复。
  • 每次获取的 User Agent 必须带有主流的操作系统信息(可以是 UinuxWindowsIOS 和安卓等等)。

这里三点都可以从 UA 数据的来源解决,实际上我们应该关注具体的实现方案。简单分析一下,流程如下:

使用Redis实现UA池的方案

在设计 UA 池的时候,它的数据结构和环形队列十分类似:

使用Redis实现UA池的方案

上图中,假设不同颜色的 UA 是完全不同的 UA ,它们通过洗牌算法打散放进去环形队列中,实际上每次取出一个 UA 之后,只需要把游标 cursor 前进或者后退一格即可(甚至可以把游标设置到队列中的任意元素)。最终的实现就是:需要通过中间件实现分布式队列(只是队列,不是消息队列)。

具体实现方案

毫无疑问需要一个分布式数据库类型的中间件才能存放已经准备好的 UA ,第一印象就感觉 Redis 会比较合适。接下来需要选用 Redis 的数据类型,主要考虑几个方面:

UA

支持这几个方面的 Redis 数据类型就是 List ,不过注意 List 本身不能去重,去重的工作可以用代码逻辑实现。然后可以想象客户端获取 UA 的流程大致如下:

使用Redis实现UA池的方案

结合前面的分析,编码过程有如下几步:

准备好需要导入的 UA 数据,可以从数据源读取,也可以直接文件读取。

  •  因为需要导入的 UA 数据集合一般不会太大,考虑先把这个集合的数据随机打散,如果使用 Java 开发可以直接使用 Collections#shuffle() 洗牌算法,当然也可以自行实现这个数据随机分布的算法, 这一步对于一些被模拟方会严格检验 UA 合法性的场景是必须的 。
  • 导入 UA 数据到 Redis 列表中。
  • 编写 RPOP + LPUSHLua 脚本,实现分布式循环队列。

编码和测试示例

引入 Redis 的高级客户端 Lettuce 依赖:


  io.lettuce
  lettuce-core
  5.2.1.RELEASE

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:使用Redis实现UA池的方案-创新互联
文章位置:http://pwwzsj.com/article/doioop.html