最近忙于业务开发、交接和游戏,加上碰上了不定时出现的犹豫期和困惑期,荒废学业了一段时间。天冷了,要重新拾起开始下阶段的学习了。之前接触到的一些数据搜索项目,涉及到请求模拟,基于反爬需要使用随机的 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
依赖:
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756