多优先队列协程池爬虫及消息推送技术分析

作者:Naihe

Github:https://github.com/239144498


项目需求:将某Discourse论坛最新消息进行多重过滤,判定信息的不同优先级并及时推送到手机。

项目难点

  1. 论坛针对网络请求设置了IP和Token限流,频繁请求会触发429报错
  2. 针对不同信息流的分类,优先处理重要事件
  3. 避免任务高并发被服务端发现的可能
  4. 多生产-多加工-多消费模型之间的关系处理
  5. AI在信息流中实现分类应用的问题

问题1 通过将0级信息通过低级代理池请求,高级信息通过多账号的专用ip代理池处理。

问题3 通过设置合理的协程并发数,并且基于时间段设置不同请求频率间隔,以及根据白天和黑夜设置账号请求策略,能很大程度解决此问题.

问题2 通过GET Topics得到信息流列表,提取每条信息所携带的Topic 类型标签等级UIDAI分类特征。

基于上述的信息特征通过写好的多重表达式进行综合评判,可以将信息分为CRITICALPRESSINGPLANNEDOPTIONALPASS五大类。

优先将CRITICALPRESSING立即处理,PASS作为最后处理类型,并且不推送消息。

问题4 也是一大难点,需要根据项目特性合理分配不同任务给到相应协程池,具体实现在下面展开讲。

问题5 经过长时间运行我发现AI有小概率出现幻觉,虽然不多但是很影响项目运行效果,我希望Ai能够根据提供的内容通过指定的提示词按照要求进行分类,最终输出标准的JSON内容,但是由于AI幻觉问题,可能会输出错误的信息,那么我针对该现象写了一个SafeJSON解析器处理Ai的内容,能够很大程度解决这一问题。


项目大致运行流程如下

GET Topics -> 分类高/低级信息 -> submit 高/低级生产池 -> submit 信息加工处理池 -> 推送消费池

第一步通过低级信息请求 和 高级信息请求,将两者做差集,可以分别得到高/低Topics,根据每条信息特征可以总结出以下展开特征

用户类型:指定用户、普通用户、黑名单用户
贴子类型:指定类型、普通类型、黑名单类型
内容类型:指定关键字内容、普通内容、黑名单关键字内容
贴子标签:指定标签、普通标签、黑名单标签
帖子等级:高级贴、零级贴

第二步根据这些特征我将它融合到五大类中,在不同组合中可以得到100多种信息特征。我根据每种类写了多组匹配表达式,可以很好的判断哪个信息属于哪种类别。

第三步根据五大类别,CRITICALPRESSING类可以直接给到消费池,确保重要和紧急信息能够及时推送,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 中国大陆许可协议进行许可。

posted @   Naihe\  阅读(5)  评论(0编辑  收藏  举报
// 音乐播放器
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起