多优先队列协程池爬虫及消息推送技术分析
作者:Naihe
Github:https://github.com/239144498
项目需求:将某Discourse论坛最新消息进行多重过滤,判定信息的不同优先级并及时推送到手机。
项目难点:
- 论坛针对网络请求设置了IP和Token限流,频繁请求会触发429报错
- 针对不同信息流的分类,优先处理重要事件
- 避免任务高并发被服务端发现的可能
- 多生产-多加工-多消费模型之间的关系处理
- AI在信息流中实现分类应用的问题
问题1 通过将0级信息通过低级代理池请求,高级信息通过多账号的专用ip代理池处理。
问题3 通过设置合理的协程并发数,并且基于时间段设置不同请求频率间隔,以及根据白天和黑夜设置账号请求策略,能很大程度解决此问题.
问题2 通过GET Topics得到信息流列表,提取每条信息所携带的Topic 类型
、标签
、等级
、UID
和AI分类
特征。
基于上述的信息特征通过写好的多重表达式进行综合评判,可以将信息分为CRITICAL
、PRESSING
、PLANNED
、OPTIONAL
、PASS
五大类。
优先将CRITICAL
、PRESSING
立即处理,PASS
作为最后处理类型,并且不推送消息。
问题4 也是一大难点,需要根据项目特性合理分配不同任务给到相应协程池,具体实现在下面展开讲。
问题5 经过长时间运行我发现AI有小概率出现幻觉,虽然不多但是很影响项目运行效果,我希望Ai能够根据提供的内容通过指定的提示词按照要求进行分类,最终输出标准的JSON内容,但是由于AI幻觉问题,可能会输出错误的信息,那么我针对该现象写了一个SafeJSON解析器处理Ai的内容,能够很大程度解决这一问题。
项目大致运行流程如下
GET Topics -> 分类高/低级信息 -> submit 高/低级生产池 -> submit 信息加工处理池 -> 推送消费池
第一步通过低级信息请求 和 高级信息请求,将两者做差集,可以分别得到高/低Topics,根据每条信息特征可以总结出以下展开特征
用户类型:指定用户、普通用户、黑名单用户
贴子类型:指定类型、普通类型、黑名单类型
内容类型:指定关键字内容、普通内容、黑名单关键字内容
贴子标签:指定标签、普通标签、黑名单标签
帖子等级:高级贴、零级贴
第二步根据这些特征我将它融合到五大类中,在不同组合中可以得到100多种信息特征。我根据每种类写了多组匹配表达式,可以很好的判断哪个信息属于哪种类别。
第三步根据五大类别,CRITICAL
和PRESSING
类可以直接给到消费池,确保重要和紧急信息能够及时推送,PASS
类在这一步被过滤,其他类正常进入生产池。
第四步将生产池返回的内容投入到加工池,通过预先设置好的系统提示词,让Ai再一次分类,可以得到以下JSON信息结构。
{
"type": 0/1/-1,
"object": "简洁精准的主题描述",
"keys": ["关键词1", "关键词2", "关键词3"],
"confidence": 0-100
}
type 0
表示普通信息,type 1
表示感兴趣信息,type -1
表示不感兴趣信息,如果 confidence
达到指定的可信值,就更新类别。将更新后的PASS
类过滤,其他类投入到消费池。
第五步将加工池返回的信息,根据信息类别设置指定的推送事件类型,推送到用户手机中。
项目文件结构
paths_to_zip = [
'spider',
'requirements.txt',
'main.py',
'coordinator.py',
'consume.py',
'produce.py',
'process.py',
]
Spider
__init__.py
ai.py
config.py
crawler.py
filter.py
models.py
network.py
notifier.py
priorityAsyncPool.py
setting.py
tokenBucket.py
utils.py
4个协程池
producer_queue
处理普通生产事件
single_producer_queue
处理高级生产事件
processor_queue
处理加工事件
consumer_queue
处理消费事件
到这里整个项目流程就可以正常跑通,在多生产-消费模型中,可以将项目代码中关键节点很好的解耦,方便后期维护和使用,比之前任务流式的多线程跑要好很多。
五大类参考了四象限模型,增加了一个PASS类型,可以很好的根据不同类型进行推送处理。
在网络请求中,我将账号分为0-3四个级别,并给每个级别的账号池设置了tokenBucket限流,确保不会触发429报错。
账号池通过最小堆实现,可以根据具体需求,给每个账号设置相应权重。
以上信息为By Naihe创作,转载请标明出处!
作者:Naihe
Github:https://github.com/239144498
本文作者:Naihe\
本文链接:https://www.cnblogs.com/1314h/p/18692656
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步