重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
最近忙于业务开发、交接和游戏,加上碰上了不定时出现的犹豫期和困惑期,荒废学业了一段时间。天冷了,要重新拾起开始下阶段的学习了。之前接触到的一些数据搜索项目,涉及到请求模拟,基于反爬需要使用随机的 User Agent
,于是使用 Redis
实现了一个十分简易的 UA
池。
背景
最近的一个需求,有模拟请求的逻辑,要求每次请求的请求头中的 User Agent
要满足下面几点:
User Agent
是随机的。User Agent
(短时间内)不能重复。User Agent
必须带有主流的操作系统信息(可以是 Uinux
、 Windows
、 IOS
和安卓等等)。这里三点都可以从 UA
数据的来源解决,实际上我们应该关注具体的实现方案。简单分析一下,流程如下:
在设计 UA
池的时候,它的数据结构和环形队列十分类似:
上图中,假设不同颜色的 UA
是完全不同的 UA
,它们通过洗牌算法打散放进去环形队列中,实际上每次取出一个 UA
之后,只需要把游标 cursor
前进或者后退一格即可(甚至可以把游标设置到队列中的任意元素)。最终的实现就是:需要通过中间件实现分布式队列(只是队列,不是消息队列)。
具体实现方案
毫无疑问需要一个分布式数据库类型的中间件才能存放已经准备好的 UA
,第一印象就感觉 Redis
会比较合适。接下来需要选用 Redis
的数据类型,主要考虑几个方面:
UA
支持这几个方面的 Redis
数据类型就是 List
,不过注意 List
本身不能去重,去重的工作可以用代码逻辑实现。然后可以想象客户端获取 UA
的流程大致如下:
结合前面的分析,编码过程有如下几步:
准备好需要导入的 UA
数据,可以从数据源读取,也可以直接文件读取。
UA
数据集合一般不会太大,考虑先把这个集合的数据随机打散,如果使用 Java
开发可以直接使用 Collections#shuffle()
洗牌算法,当然也可以自行实现这个数据随机分布的算法, 这一步对于一些被模拟方会严格检验 UA
合法性的场景是必须的 。UA
数据到 Redis
列表中。RPOP + LPUSH
的 Lua
脚本,实现分布式循环队列。编码和测试示例
引入 Redis
的高级客户端 Lettuce
依赖:
io.lettuce lettuce-core 5.2.1.RELEASE
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。