MediaCrawler 词云图完全指南:从配置项到源码实现,生成评论词频统计与词云图
MediaCrawler 词云图完全指南从配置项到源码实现生成评论词频统计与词云图【免费下载链接】MediaCrawler小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 评论爬虫、微博帖子 评论爬虫、百度贴吧帖子 百度贴吧评论回复爬虫 | 知乎问答文章评论爬虫项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawlerMediaCrawler 内置了基于 jieba 分词与 wordcloud 库的评论词云生成功能可在爬取完成后自动统计评论内容词频并绘制词云图帮助快速把握舆情热点与高频关键词。本文以 docs/词云图使用配置.md 为主线完整覆盖所有需要修改的配置项及其取值说明并结合 tools/words.py、tools/async_file_writer.py 与 main.py 的源码讲清词云从触发、分词、词频统计到出图的完整调用链以及产出文件的确切位置和命名规则。一、前提条件为什么必须是 json 或 jsonl 存储原文档明确指出只有当保存格式为 json 或 jsonl 文件时才会生成词云图其他存储方式csv、db 等暂不支持词云功能。这一约束在入口代码中可以得到印证。main.py 中的_generate_wordcloud_if_needed函数是整个词云流程的守门员async def _generate_wordcloud_if_needed() - None: if config.SAVE_DATA_OPTION not in (json, jsonl) or not config.ENABLE_GET_WORDCLOUD: return try: file_writer AsyncFileWriter( platformconfig.PLATFORM, crawler_typecrawler_type_var.get(), ) await file_writer.generate_wordcloud_from_comments() except Exception as e: print(f[Main] Error generating wordcloud: {e})从源码结构看逻辑非常清晰SAVE_DATA_OPTION必须是json或jsonl否则直接返回ENABLE_GET_WORDCLOUD必须为True爬取流程await crawler.start()全部结束之后才调用 tools/async_file_writer.py 中的generate_wordcloud_from_comments()从已落盘的评论文件中读取数据并生成词云。这也解释了为什么词云功能依赖文件存储它是爬取完成后的后置分析步骤直接读取本次运行写入磁盘的评论文件优先 jsonl其次 json而不是在爬取过程中实时生成。二、需要修改的 6 个配置项所有配置项均位于 config/base_config.py。以下逐项给出配置示例、默认值与源码级解释。1. SAVE_DATA_OPTION数据保存格式# 数据保存类型选项配置,支持多种类型csv、db、json、jsonl等 # 此处需要为json或jsonl格式保存原因如上 SAVE_DATA_OPTION jsonl # csv or db or json or jsonl位置config/base_config.py#L89-L90当前仓库默认值即为jsonl。注释中说明支持的完整取值为csv、db、json、jsonl、sqlite、excel、postgres但只有json/jsonl会触发生成词云。2. ENABLE_GET_COMMENTS是否开启评论爬取# 是否开启爬评论模式, 默认不开启爬评论 # 此处为True需要爬取评论才可以生成评论的词云图 ENABLE_GET_COMMENTS True位置config/base_config.py#L110-L111词云图的原始素材就是评论内容。如果不开启评论爬取磁盘上就没有评论数据generate_wordcloud_from_comments会打印No comments data found日志并提前返回。当前仓库默认值为True。3. ENABLE_GET_WORDCLOUD词云功能总开关# 词云相关 # 是否开启生成评论词云图 # 打开词云图功能 ENABLE_GET_WORDCLOUD True位置config/base_config.py#L120-L122默认值为False必须显式改为True。tools/async_file_writer.py#L35 中词云生成器就是依据这个开关是否实例化的self.wordcloud_generator AsyncWordCloudGenerator() if config.ENABLE_GET_WORDCLOUD else None4. CUSTOM_WORDS自定义词组及其分组# 添加自定义词语及其分组 # 添加规则xx:yy 其中xx为自定义添加的词组yy为将xx该词组分到的组名。 CUSTOM_WORDS { 零几: 年份, # 将零几识别为一个整体 高频词: 专业术语 # 示例自定义词 }位置config/base_config.py#L123-L128相关解释xx:yy中xx为自定义词语yy为该词分配的组别yy可以随便取任意值。从源码看tools/words.py#L42-L44 的用法是self.custom_words config.CUSTOM_WORDS for word, group in self.custom_words.items(): jieba.add_word(word)即自定义词最终通过jieba.add_word注入分词词典保证像零几这样的词组在分词时不被拆散。值组名目前仅起标注/分组说明作用分词阶段只使用键。5. STOP_WORDS_FILE停用词文件路径# 停用(禁用)词文件路径 STOP_WORDS_FILE ./docs/hit_stopwords.txt位置config/base_config.py#L130-L131默认指向仓库自带的 docs/hit_stopwords.txt一个词语占一行。如需添加禁用词直接在该文件中追加即可无需改代码。加载逻辑见 tools/words.py#L46-L48def load_stop_words(self): with open(self.stop_words_file, r, encodingutf-8) as f: return set(f.read().strip().split(\n))停用词集合在分词过滤和 WordCloud 构造两个环节都会被使用stopwordsself.stop_words。6. FONT_PATH中文字体文件路径# 中文字体文件路径 FONT_PATH ./docs/STZHONGS.TTF位置config/base_config.py#L133-L134FONT_PATH决定词云图中中文文字的字体默认为宋体仓库内置 docs/STZHONGS.TTF。可以自行下载字体文件如思源黑体、阿里巴巴普惠体等放入仓库任意目录再修改此路径。若不配置有效的中文字体中文词汇在词云图中会出现方块乱码这是使用词云功能时最常见的坑。三、词云生成源码流程从落盘数据到 PNG 图片配置正确后一次完整爬取的词云产出链路如下main.py: crawler.start() 完成 └─ _generate_wordcloud_if_needed() # 检查 SAVE_DATA_OPTION / ENABLE_GET_WORDCLOUD └─ AsyncFileWriter.generate_wordcloud_from_comments() ├─ 读取 data/{平台}/comments.jsonl或 comments.json ├─ 过滤出有效 content 字段 └─ AsyncWordCloudGenerator.generate_word_frequency_and_cloud() ├─ jieba.lcut 分词 停用词过滤 ├─ Counter 统计词频 → 写 *_word_freq.json └─ WordCloud 取 Top20 → 写 *_word_cloud.png1. 评论数据的读取与字段归一化各平台的评论字段命名并不统一tools/async_file_writer.py#L120-L128 做了兼容处理for comment in comments_data: if isinstance(comment, dict): # Try different possible content field names content_text comment.get(content) or comment.get(comment_text) or comment.get(text) or if content_text: filtered_data.append({content: content_text})也就是说小红书、微博等平台落盘评论中的不同正文字段名都会被归一化到content再交给分词器处理没有有效正文的评论会被跳过并记录No valid comment content found日志。2. 分词与词频统计tools/words.py#L50-L58 中所有评论内容拼接后统一分词all_text .join(item[content] for item in data) words [word for word in jieba.lcut(all_text) if word not in self.stop_words and len(word.strip()) 0] word_freq Counter(words)随后词频字典以 4 空格缩进、非 ASCII 中文不转义的方式写入*_word_freq.json。这份 JSON 是完整的全量词频统计比词云图本身只取 Top 20信息更全适合做后续量化分析。3. 词云绘图参数与并发保护tools/words.py#L67-L90 中绘图参数的实际取值参数取值说明font_pathconfig.FONT_PATH中文字体避免乱码width/height800/400词云画布尺寸像素background_colorwhite白底max_words200词云最多容纳的词条数stopwords停用词集合与STOP_WORDS_FILE一致colormapviridis配色方案contour_color/contour_widthsteelblue/1词云轮廓输出 DPI300plt.savefig(..., dpi300)保证图片清晰度值得注意的两点实现细节只取 Top 20 词绘词云generate_word_cloud先把词频降序排序后截取前 20 条传给generate_from_frequencies即词云图本身只展示热度最高的 20 个词完整词频仍以 JSON 文件为准全局异步绘图锁模块级plot_lock asyncio.Lock()tools/words.py#L34防止多协程并发调用 matplotlib 绘图。若锁已被占用会打印Skipping word cloud generation as the lock is held.并跳过本次绘图——词频 JSON 依然会生成只是词云图被跳过。这是排查有 json 没有 png现象时的关键线索。四、生成词云图的位置与文件命名按原文档说明产出位于data目录下对应平台的words文件夹中json为词频统计文件png为词云图而原本的评论内容仍在jsonl或json文件夹下。具体路径与命名规则见 tools/async_file_writer.py#L134-L140if config.SAVE_DATA_PATH: words_base_path f{config.SAVE_DATA_PATH}/{self.platform}/words else: words_base_path fdata/{self.platform}/words pathlib.Path(words_base_path).mkdir(parentsTrue, exist_okTrue) words_file_prefix f{words_base_path}/{self.crawler_type}_comments_{utils.get_current_date()}以小红书搜索模式为例未自定义SAVE_DATA_PATH时最终产出为data/xhs/words/search_comments_20260903_word_freq.json—— 全量词频统计data/xhs/words/search_comments_20260903_word_cloud.png—— 词云图Top 20 词命名模式为{crawler_type}_comments_{日期}crawler_type由本次运行入口决定如search、detail等日期取当天。若设置了SAVE_DATA_PATH则words目录会建在该自定义路径的平台子目录下。五、完整操作步骤与排查清单最小操作步骤以小红书为例打开 config/base_config.py确认/修改SAVE_DATA_OPTION jsonl、ENABLE_GET_COMMENTS True、ENABLE_GET_WORDCLOUD True按需维护CUSTOM_WORDS、STOP_WORDS_FILE、FONT_PATH安装依赖jieba、wordcloud、matplotlib、aiofiles均已列入 requirements.txt运行python main.py完成一次爬取爬取结束后在data/{平台}/words/下查看*_word_freq.json与*_word_cloud.png。常见问题排查现象可能原因依据完全没有 words 目录SAVE_DATA_OPTION不是 json/jsonl或ENABLE_GET_WORDCLOUD Falsemain.py#L86-L88有词频 json 却没有 png绘图锁被占用跳过了出图查看日志是否有Skipping word cloud generationtools/words.py#L61-L63词云图中文显示为方块FONT_PATH未指向有效中文字体config/base_config.py#L133-L134日志提示 No comments data found未开启评论爬取或本次未爬到任何评论tools/async_file_writer.py#L116-L118需要说明的是词云图仅基于评论内容生成笔记/视频正文不在统计范围内max_words200与 Top 20 截取等绘图参数目前硬编码在 tools/words.py 中如需调整画布尺寸、配色或展示词数可直接修改该文件中的WordCloud(...)构造参数。【免费下载链接】MediaCrawler小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 评论爬虫、微博帖子 评论爬虫、百度贴吧帖子 百度贴吧评论回复爬虫 | 知乎问答文章评论爬虫项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →