简介
无意中发现 Liuli 这个项目,项目 Github:https://github.com/liuli-io/liuli
看了其文章,发现 Liuli 是 Python 实现的,便打算简单看看其实现细节,老规矩,看项目,先将好奇点写下来:
1.Python 怎么实现宣传文章中那么漂亮的 PC 软件界面的?
2. 如何采集公众号文章?
对,我就对这两点感兴趣,经过一番阅读后,关于好奇 1,其实人家没有实现漂亮的 PC 软件界面,Liuli 只是采集,然后将内容推送过去,所以本文的重点,就是看一下它是怎么采集公众号文章的,此外在阅读过程中,发现 LiuLi 还使用了简单的方法来识别文章是否为广告文章,这点也挺有意思的,也记录一下。
公众号文章采集
Liuli 基于搜狗微信(https://weixin.sogou.com/)对公众号文章进行采集,而且实现了 2 种方式:
使用 playwright 自动化浏览器的方式实现公众号文章采集
使用 ruia 爬虫框架实现公众号文章的采集
我们可以通过相应的配置文件控制 Liuli 使用其中哪种方式来进行文章采集,其默认使用 ruia 的方式进行采集。
Liuli 将功能分为多个模块,然后通过调度器去调度不同的模块,调度器启动方法代码如下:
# src/liuli_schedule.py
def start(ll_config_name: str = ""):
"""调度启动函数
Args:
task_config (dict): 调度任务配置
"""
if not ll_config_name:
freeze_support()
# 默认启动 liuli_config 目录下所有配置
ll_config_name_list = []
for each_file in os.listdir(Config.LL_CONFIG_DIR):
if each_file.endswith("json"):
# 加入启动列表
ll_config_name_list.append(each_file.replace(".json", ""))
# 进程池
p = Pool(len(ll_config_name_list))
for each_ll_config_name in ll_config_name_list:
LOGGER.info(f"Task {each_ll_config_name} register successfully!")
p.apply_async(run_liuli_schedule, args=(each_ll_config_name,))
p.close()
p.join()
else:
run_liuli_schedule(ll_config_name)
从代码可知,调度器会启动 Python 的进程池,然后向其中添加 run_liuli_schedule 异步任务,该异步任务中,会执行 run_liuli_task 方法,该方法才是一次完整的任务流程,代码如下:
def run_liuli_task(ll_config: dict):
"""执行调度任务
Args:
ll_config (dict): Liuli 任务配置
"""
# 文章源, 用于基础查询条件
doc_source: str = ll_config["doc_source"]
basic_filter = {"basic_filter": {"doc_source": doc_