Skip to Content

4.3 数据处理与自动化(极简版)

这一节只做一件事:
把你从 API/爬虫拿到的数据,简单清洗一下,存成文件,再让脚本自动跑一次。

不追求复杂的飞书同步、分布式任务,只要有一个「小流水线」跑起来就够了。

第一步: 简单清洗 + 去重

假设你现在有一批文章数据,大致长这样:

articles = [ {"title": " Hello World ", "content": " 第一篇 文章 \n\n", "link": "https://example.com/1"}, {"title": "Hello World", "content": "内容重复", "link": "https://example.com/1"}, ]

你可以写一个很小的「清洗函数」:

def clean_text(text: str) -> str: # 去掉多余空格和换行 text = " ".join(text.split()) return text.strip() def clean_articles(raw_articles: list[dict]) -> list[dict]: cleaned: list[dict] = [] seen_titles: set[str] = set() for article in raw_articles: title = clean_text(article.get("title", "")) if not title or title in seen_titles: continue # 标题为空或重复就跳过 seen_titles.add(title) cleaned.append( { "title": title, "content": clean_text(article.get("content", "")), "link": article.get("link", ""), } ) return cleaned

做到这里,你已经完成了「数据清洗」里最常见的两步: 去空 & 去重。

第二步: 存成 CSV 文件

把清洗后的数据存成一个简单的表格文件,方便用 Excel/Notion 打开:

import csv from pathlib import Path def save_to_csv(articles: list[dict], filename: str = "articles.csv") -> None: Path(filename).parent.mkdir(parents=True, exist_ok=True) with open(filename, "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["title", "content", "link"]) writer.writeheader() writer.writerows(articles)

然后你可以在主脚本里这样串起来:

if __name__ == "__main__": # 这里可以替换成你的真实数据,比如从 API 或爬虫获取 raw_articles = articles cleaned = clean_articles(raw_articles) save_to_csv(cleaned, "output/articles.csv") print(f"已保存 {len(cleaned)} 条数据到 output/articles.csv")

运行一遍,用表格工具打开 output/articles.csv,确认格式没问题。

第三步: 让脚本每天自动跑一次(可选)

如果你希望它「每天自己跑一下」,可以先用最简单的方式——一个常驻脚本 + schedule:

import schedule import time def job(): print("开始执行抓取与处理...") # TODO: 在这里调用你的爬虫/API + clean + save_to_csv print("本次任务完成") schedule.every().day.at("08:00").do(job) while True: schedule.run_pending() time.sleep(60) # 每分钟检查一次

这一部分属于「加分项」:
先确保手动执行一次流程是成功的,再考虑让它自动化;一开始不要追求完美的调度系统。


做到这里,你已经把「4.1 API → 4.2 爬虫 → 4.3 数据处理」串成了一条最简单的自动化小流水线。
后面如果想接飞书/Notion/数据库,完全可以把现有脚本丢给 AI,让它在这个基础上继续升级。

Last updated on