多優先隊列協程池爬蟲及消息推送技術分析
作者: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

浙公網安備 33010602011771號