前言新闻资讯类爬虫在完成网页正文抓取后原始文本为无结构化自然语句海量原文直接入库会占用大量存储空间后续筛选、分类、检索新闻内容效率低下。依托 jieba 中文分词工具对爬虫抓取的新闻正文做分词处理剔除停用虚词、标点符号、无意义助词筛选高频实词作为新闻关键词可实现新闻自动标签归类、内容索引构建、重复资讯二次过滤等业务需求是爬虫数据后置清洗环节的核心处理流程。区别于全文字符匹配检索关键词标签化存储能够将单条新闻检索维度从整段文本压缩至数个特征词汇显著缩减数据库索引体积优化爬虫数据分析链路。 本文开发依赖官方文档链接统一放置于前言部分方便开发者跳转查阅安装与接口说明requests HTTP 网络请求库beautifulsoup4 HTML 解析库jieba 中文分词库官方文档collections Python 内置容器库json Python 内置序列化库全文围绕 jieba 三种分词模式原理、爬虫文本预处理规则、停用词过滤机制、TF-IDF 关键词权重提取、自定义行业词库优化、批量新闻分词落地代码、分词结果入库规范七大模块展开结合完整可运行爬虫工程代码从原始新闻抓取到关键词生成全链路落地适配财经、科技、民生等多品类新闻爬虫数据处理场景。一、jieba 分词核心原理与三种分词模式对比1.1 jieba 底层分词逻辑jieba 依托前缀词典实现高效词图扫描生成句子中汉字所有可能成词情况构成有向无环图采用动态规划查找最大概率路径找出基于词频的最大切分组合针对未登录词使用 HMM 隐马尔可夫模型依照汉字成词规律完成新词识别是目前中文爬虫文本处理使用率最高的开源分词组件。1.2 三种分词模式特征与爬虫适用场景表格分词模式实现特点适用爬虫场景优缺点说明精确模式将句子精准切分无冗余分词不生成多余词组常规资讯正文关键词提取、新闻标签生成分词粒度适中爬虫文本处理首选基础模式全模式扫描所有可能成词组合拆分出文本全部潜在词语行业新词挖掘、爬虫自建词库扩充分词冗余量大需后续多层过滤无用词汇搜索引擎模式在精确模式基础上对长词再次二次切分短标题分词、摘要短句关键词筛选兼顾精准与拆分适配新闻标题 摘要混合文本二、环境部署与依赖安装配置2.1 运行环境要求Python3.7 及以上版本内存最低 1GB大批量新闻离线分词推荐 4GB 以上内存Windows、Linux、macOS 全系统兼容无额外系统组件依赖。2.2 依赖一键安装命令bash运行pip install requests beautifulsoup4 jieba2.3 环境校验代码python运行import requests from bs4 import BeautifulSoup import jieba from collections import Counter print(爬虫与分词依赖加载完成)三、爬虫原始新闻文本预处理规范爬虫抓取的新闻原文混杂 HTML 残留标签、换行符、空格、特殊标点、广告冗余语句无法直接送入分词引擎预处理为分词前置必要步骤统一清洗规则如下利用 BeautifulSoup 剔除正文内残留p、div、a等 HTML 标签提取纯文本内容通过正则替换去除全角、半角标点符号、换行\n、制表符\t、多余空格裁剪正文首尾固定广告话术、来源声明、版权标注等非新闻主体文本统一繁体字符转为简体规避分词库简体词库无法识别繁体导致分词错乱问题。3.1 文本预处理工具代码python运行import re from bs4 import BeautifulSoup class NewsTextPreProcess: def __init__(self): # 标点符号正则匹配规则 self.punc_reg re.compile(r[^\u4e00-\u9fa5a-zA-Z0-9]) # 空白字符正则 self.space_reg re.compile(r\s) def clean_html_label(self, html_content): 清除网页标签提取纯文本 soup BeautifulSoup(html_content, html.parser) raw_text soup.get_text(stripFalse) return raw_text def clean_punctuation_and_space(self, raw_text): 去除标点与空白字符只保留中英文、数字、中文汉字 text_no_punc self.punc_reg.sub(, raw_text) final_text self.space_reg.sub(, text_no_punc) return final_text def full_preprocess(self, source_html): 完整预处理入口函数 text1 self.clean_html_label(source_html) text2 self.clean_punctuation_and_space(text1) return text23.2 预处理代码原理说明正则限定保留 Unicode 中文区间与英文字母、数字剔除其余全部符号最大程度精简无效字符降低后续分词运算压力拆分多级预处理方法便于后续按需单独开启标签清洗或符号清洗。四、停用词库构建与过滤实现中文语句内助词、介词、连词的、了、在、和、对于等出现频次极高但不具备内容特征属性无法作为关键词需依托停用词列表完成过滤。4.1 基础停用词表示例plaintext的,了,在,和,是,有,就,都,而,及,与,也,等,从,向,以,将,该,其,此4.2 停用词加载与过滤代码实现python运行class StopWordFilter: def __init__(self): # 初始化内置停用词实际项目可加载本地txt停用词文件 self.stop_words {的,了,在,和,是,有,就,都,而,及,与,也,等,从,向,以,将,该,其,此} def filter_stopword(self, word_list): 过滤停用词返回有效词汇列表 valid_words [word for word in word_list if word not in self.stop_words and len(word)2] return valid_words补充过滤规则单字汉字无关键词价值额外增加字符长度判断剔除长度小于 2 的单字词汇。五、jieba 基础分词 词频统计提取关键词基础方案依托精确分词拆分文本统计词汇出现频次选取频次 TOP-N 词汇作为新闻关键词实现逻辑简单适合中小型资讯爬虫轻量化关键词提取。5.1 基础分词关键词提取封装代码python运行import jieba from collections import Counter class BaseWordExtract: def __init__(self): self.pre NewsTextPreProcess() self.stop_filter StopWordFilter() def get_word_by_freq(self, news_html, top_n5): :param news_html: 爬虫抓取的新闻原始html :param top_n: 提取关键词数量 :return: 关键词列表 # 1.文本预处理 clean_text self.pre.full_preprocess(news_html) # 2.精确模式分词 cut_words jieba.lcut(clean_text, cut_allFalse) # 3.停用词过滤 valid_words self.stop_filter.filter_stopword(cut_words) # 4.词频统计 word_count Counter(valid_words) # 5.提取topN高频词 top_words [item[0] for item in word_count.most_common(top_n)] return top_words5.2 原理详解jieba.lcut 返回分词后列表格式适配后续列表遍历过滤Counter 自动统计列表内元素出现次数most_common 实现按频次倒序排序top_n 参数可自定义关键词输出数量常规新闻单条保留 5~8 个关键词即可满足标签需求。六、TF-IDF 算法加权关键词精准提取工业级优选单纯依靠词频提取关键词存在短板通用词汇在多篇新闻中高频出现如 “记者”“消息”无法区分内容主体TF-IDF 通过词频与逆文档频率加权弱化全局通用词汇权重强化单篇独有特征词汇权重是爬虫正式环境关键词提取主流方案。 jieba 内置 TF-IDF 接口无需手动实现算法直接调用即可完成加权筛选。6.1 TF-IDF 关键词提取完整代码python运行import jieba.analyse class TfIdfWordExtract: def __init__(self): self.pre NewsTextPreProcess() self.stop_filter StopWordFilter() def get_tfidf_keyword(self, news_html, top_k6): clean_text self.pre.full_preprocess(news_html) # jieba内置TFIDF提取关键词withWeightTrue返回(关键词,权重)元组 keyword_with_weight jieba.analyse.extract_tags(clean_text, topKtop_k, withWeightTrue) # 拆分关键词与权重数据 keyword_list [item[0] for item in keyword_with_weight] weight_dict {item[0]:round(item[1],4) for item in keyword_with_weight} return keyword_list, weight_dict6.2 TF-IDF 核心原理简述TF 指词语在单篇新闻出现频率IDF 指词语在全量新闻库中出现文档占比词语在单篇高频、全库低频时 TF-IDF 数值最高即为新闻核心关键词权重数值越高代表词汇区分度越强。七、自定义词典优化行业新闻分词效果通用 jieba 词库缺少垂直行业专有名词如财经北向资金、碳中和科技大模型、算力芯片直接分词会拆分专业术语造成关键词提取失真通过自定义词库补充行业词汇固定专有名词不被拆分。7.1 自定义词典格式userdict.txtplaintext北向资金 3 nz 碳中和 3 ng 大模型 3 ng 算力芯片 3 ng格式规范词语 词频 词性词频数值越大分词优先度越高。7.2 项目加载自定义词典代码python运行# 程序启动时加载自定义词典全局生效 jieba.load_userdict(userdict.txt)7.3 动态临时添加词汇单条新闻突发新词无需修改词典文件运行时动态添加python运行jieba.add_word(生成式AI)八、完整新闻爬虫 分词关键词生成全链路实战整合网页抓取、文本清洗、分词、关键词提取全流程模拟资讯爬虫批量抓取新闻并自动生成标签关键词结果以字典格式存储可直接写入 MySQL 或 CSV。python运行import requests class NewsSpiderWithCut: def __init__(self): self.headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36} self.tfidf_ext TfIdfWordExtract() def crawl_single_news(self, url): try: resp requests.get(url, headersself.headers, timeout6) resp.encoding resp.apparent_encoding # TF-IDF提取关键词 keywords, weight_info self.tfidf_ext.get_tfidf_keyword(resp.text,top_k6) res_data { news_url:url, keywords:keywords, word_weight:weight_info } print(单条新闻分词结果,res_data) return res_data except Exception as e: print(f抓取异常:{str(e)}) return None def batch_crawl(self, url_list): 批量抓取多条新闻批量分词 save_result [] for link in url_list: item self.crawl_single_news(link) if item: save_result.append(item) # 此处可追加写入数据库逻辑 return save_result if __name__ __main__: spider NewsSpiderWithCut() test_urls [https://target.news.com/content/1,https://target.news.com/content/2] spider.batch_crawl(test_urls)九、大批量离线分词性能优化方案爬虫落地后常会积攒数十万条历史新闻文本需要离线批量分词针对海量数据优化手段汇总启用 jieba 多进程分词借助multiprocessing拆分文本列表多进程并行切割CPU 多核利用率提升处理速度提升 2~4 倍停用词文件本地化放弃代码内置集合加载数万词量级完整停用词 txt提升过滤精细度预加载自定义词库程序初始化阶段一次性载入行业词典避免循环分词重复加载消耗 IO。9.1 简易多进程分词示例片段python运行from multiprocessing import Pool def batch_cut_process(text_list,process_num4): pool Pool(process_num) res pool.map(jieba.lcut,text_list) pool.close() pool.join() return res十、分词异常问题排查与解决方案表格故障现象问题诱因处理方案专业词汇被拆分成多个单字词库无对应行业名词补充自定义 userdict 词典添加目标专有名词关键词全部为通用虚词停用词库词汇量过少扩充停用词文件导入全量中文停用词表TF-IDF 提取关键词重复率过高多篇新闻主题高度重合缩小 topK 取值结合正文首尾摘要二次筛选关键词大批量分词内存持续飙升分词过程无及时释放临时列表分批切割文本单次加载 500 条以内新闻处理完成清空临时数据十一、分词结果落地存储规范爬虫生成的关键词数据推荐两种入库格式MySQL新闻主表新增keywords字符串字段逗号分隔存储关键词word_weight用 JSON 格式存入 TEXT 字段Elasticsearch关键词字段设置分词索引依托生成标签实现站内全文检索。