Python 爬虫项目 关键词筛选过滤目标爬取内容
2026/6/10 19:46:39 网站建设 项目流程

前言

在网络数据采集的工程实践中,原始爬取结果往往包含大量冗余信息、无效文本以及与业务需求无关的噪声数据,单纯完成页面内容抓取并不能直接支撑数据分析、信息检索、内容聚合等上层业务。关键词筛选与内容过滤作为爬虫工程体系中数据预处理的核心环节,承担着数据提纯、目标内容精准截留、无效数据剔除的关键作用,也是区分入门爬虫脚本与工业化爬虫项目的重要标志。

本文围绕 Python 爬虫场景下关键词筛选与内容过滤全流程展开讲解,从基础字符串匹配、规则化过滤,到正则表达式精准匹配、分词语义级筛选,再到批量数据过滤、多级过滤架构设计、性能优化与异常处理进行逐层拆解。结合真实业务场景编写可落地代码案例,同时剖析每一段代码底层运行逻辑与设计思路,兼顾理论原理与工程实战。本文适配中小型数据采集、垂直领域资讯抓取、商品信息爬取、舆情数据采集等多类爬虫场景,帮助开发者搭建标准化、可复用、高稳定性的内容过滤模块。

本文开发与运行所依赖的第三方库、工具及官方地址如下,读者可直接跳转完成环境部署:

  1. Python 官方环境:https://www.python.org/
  2. requests 网络请求库:https://pypi.org/project/requests/
  3. BeautifulSoup 网页解析库:https://pypi.org/project/beautifulsoup4/
  4. re 正则表达式库(Python 标准库,内置无需额外安装)
  5. jieba 中文分词库:https://pypi.org/project/jieba/
  6. pandas 批量数据处理库:https://pypi.org/project/pandas/
  7. json 数据格式处理库(Python 标准库,内置无需额外安装)

一、爬虫内容过滤的业务场景与设计原则

1.1 典型业务应用场景

网络爬虫获取的原始数据具备来源杂乱、格式不统一、信息密度参差不齐的特点,关键词筛选与内容过滤几乎贯穿所有商业化爬虫项目,主流应用场景可划分为五大类。

第一类为垂直资讯爬虫,针对新闻、行业资讯、博客内容采集时,需要根据行业关键词、热点词汇、地域标签过滤无关资讯,例如金融资讯爬虫仅保留包含 “基金”“股票”“理财” 等关键词的内容,剔除娱乐、体育类无关文本。

第二类为电商数据爬虫,采集商品标题、详情、评价数据时,通过关键词过滤劣质评价、广告灌水内容、竞品无关信息,同时筛选指定品类、指定品牌的商品数据,缩减后续数据处理成本。

第三类为舆情监控爬虫,针对社交平台、论坛、评论区数据抓取,依靠敏感词、舆情关键词完成风险内容筛选、热点话题聚类,是网络舆情分析系统的核心前置模块。

第四类为文档与文库爬虫,抓取网页文档、问答内容时,过滤广告弹窗文本、导航栏冗余文字、重复模板内容,仅保留核心正文数据。

第五类为多源数据聚合爬虫,对接多个数据源站点时,统一关键词过滤规则,实现不同站点数据标准化提纯,保证聚合后数据口径一致。

1.2 内容过滤模块核心设计原则

在工程化爬虫项目中,关键词筛选过滤模块不能仅实现基础匹配功能,需结合爬虫高并发、大数据量、长期稳定运行的特性,遵循六大设计原则,保障模块可用性与扩展性。

第一,规则可配置原则。过滤关键词、排除关键词、匹配模式不应硬编码在代码内部,支持通过配置文件、数据库、外部接口动态修改规则,无需重启爬虫服务即可更新过滤策略,适配业务规则频繁变更的场景。

第二,分层过滤原则。采用 “粗过滤 + 精过滤 + 语义过滤” 三级架构,粗过滤完成大粒度无效数据快速拦截,减少后续计算量;精过滤完成精准关键词匹配;语义过滤解决近义词、变形词、语句语序变化带来的漏匹配问题。

第三,性能优先原则。爬虫属于 IO 密集型结合计算密集型应用,过滤逻辑需控制时间复杂度,针对十万级、百万级爬取数据,避免使用低效循环匹配方式,优先采用哈希表、正则预编译、分词缓存等优化手段。

第四,容错兼容原则。网页内容存在大小写混杂、全角半角字符混用、特殊符号穿插、换行空格冗余等问题,过滤逻辑需做字符标准化处理,兼容各类不规则文本格式,避免正常目标内容被误过滤。

第五,结果可追溯原则。对被过滤的内容记录过滤原因、命中关键词、过滤时间,生成日志台账,便于后期规则排查、误判修正与规则迭代。

第六,解耦复用原则。将关键词过滤逻辑封装为独立工具类或函数模块,与爬虫请求、页面解析、数据存储模块解耦,支持在不同爬虫脚本、不同项目中直接复用。

1.3 过滤类型划分

根据匹配逻辑与技术实现方式,爬虫内容过滤可划分为四大类型,不同类型适配不同业务精度需求,具体分类及适用场景如下表所示:

表格

过滤类型核心实现技术匹配精度运行性能适用业务场景
基础字符串匹配过滤Python 内置字符串方法极高简单内容拦截、单关键词快速筛选、临时测试爬虫
正则表达式过滤re 模块正则匹配中高复杂格式文本、关键词组合匹配、特殊字符过滤、固定模板内容剔除
关键词集合批量过滤集合遍历、哈希匹配大批量关键词库、黑名单 / 白名单拦截、多关键词并行筛选
中文分词语义过滤jieba 分词 + 关键词匹配中低语义级内容筛选、近义词匹配、长文本精准过滤、舆情分析类爬虫

二、基础环境搭建与原始爬虫数据获取

在讲解过滤逻辑前,首先完成基础爬虫编写,实现网页请求、页面解析、原始文本数据提取,作为后续过滤模块的数据源。本节使用 requests 库完成网络请求,BeautifulSoup 完成 HTML 页面解析,模拟通用资讯类爬虫抓取网页正文、标题、摘要等文本内容。

2.1 环境依赖安装

若本地未安装对应第三方库,打开系统命令行执行以下安装指令,完成依赖部署:

bash

运行

pip install requests beautifulsoup4 jieba pandas

2.2 基础爬虫代码实现

该代码实现目标网页的 GET 请求、HTML 解析、多字段文本提取,输出原始未经过滤的爬取数据,为后续关键词筛选提供原始数据集。

python

运行

import requests from bs4 import BeautifulSoup # 配置请求头部,模拟浏览器访问,防止站点反爬 HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } def get_raw_crawl_data(url: str) -> dict: """ 基础爬虫函数:抓取网页原始文本数据 :param url: 目标爬取网址 :return: 字典格式原始数据,包含标题、正文、网页链接、原始文本 """ try: # 发送GET请求,设置超时时间10秒,避免请求阻塞 response = requests.get(url, headers=HEADERS, timeout=10) # 设置网页编码,解决中文乱码问题 response.encoding = response.apparent_encoding # 使用BeautifulSoup解析HTML文档 soup = BeautifulSoup(response.text, "html.parser") # 提取网页标题 title = soup.find("title").get_text(strip=True) if soup.find("title") else "" # 提取页面所有正文文本(简化提取,模拟真实爬虫原始数据) body_text = soup.get_text(strip=False) # 拼接原始数据字典 raw_data = { "url": url, "title": title, "content": body_text, "status": "原始数据" } return raw_data except Exception as e: # 异常捕获,记录请求错误 error_data = { "url": url, "title": "", "content": f"请求异常:{str(e)}", "status": "请求失败" } return error_data # 测试调用 if __name__ == "__main__": test_url = "https://www.example.com" result = get_raw_crawl_data(test_url) print("爬虫原始数据:") print(f"标题:{result['title']}") print(f"正文片段:{result['content'][:200]}")

2.3 代码原理详解

  1. 请求头部配置:站点通常会拦截无 UA 标识的程序请求,通过自定义User-Agent模拟主流浏览器,绕过基础反爬策略,这是 Python 爬虫通用基础配置。
  2. 请求超时设置timeout=10限定请求最长等待时间为 10 秒,若目标服务器响应缓慢、网络中断,程序会主动抛出超时异常,避免爬虫线程永久阻塞,保障整体任务稳定性。
  3. 编码处理逻辑:网页编码格式包含 UTF-8、GBK、GB2312 等多种类型,response.apparent_encoding会自动识别网页真实编码并赋值给响应对象,彻底解决中文文本乱码问题,是文本类爬虫的核心细节。
  4. HTML 解析逻辑BeautifulSoup将 HTML 结构化文档转换为可遍历的对象,find("title")定位页面标题标签,get_text()提取标签内纯文本内容,strip=True表示去除文本首尾空格与换行符,精简原始文本。
  5. 异常捕获机制:使用全局异常捕获Exception拦截网络错误、解析错误、标签不存在等各类异常,返回标准化错误数据,保证爬虫单条任务失败不会导致整个程序崩溃。
  6. 数据格式设计:采用字典存储爬取结果,统一字段规范,后续所有过滤模块均基于该字典结构开发,实现数据格式统一。

三、基础字符串匹配过滤实战

基础字符串匹配是最简单、性能最高的过滤方式,依托 Python 原生字符串内置方法实现关键词判断,适用于规则简单、数据量大的基础过滤场景,也是爬虫入门阶段最常用的过滤方案。

3.1 核心字符串方法说明

Python 内置字符串提供in成员判断、find()count()startswith()endswith()等方法,可快速完成关键词匹配、内容拦截,各方法功能及适用场景如下表:

表格

字符串方法功能描述返回值适用过滤场景
keyword in text判断关键词是否存在于文本中布尔值 True/False关键词存在性判断、白名单筛选
text.find(keyword)查找关键词首次出现位置索引值,不存在返回 - 1精准定位关键词位置、局部内容过滤
text.count(keyword)统计关键词出现次数整数次数高频垃圾内容过滤、广告文本拦截
text.lower()英文字母转为小写标准化文本大小写不敏感的英文关键词过滤
text.replace()替换指定字符 / 关键词处理后文本冗余字符、固定垃圾词汇剔除

3.2 单关键词白名单过滤

白名单过滤即包含指定关键词则保留内容,不包含则过滤剔除,是资讯、商品、行业数据爬虫最常用的逻辑。本节基于原始爬虫数据,实现单关键词白名单筛选功能。

3.2.1 代码实现

python

运行

def single_keyword_white_filter(raw_data: dict, target_key: str) -> dict: """ 单关键词白名单过滤:包含目标关键词则保留数据,否则标记为过滤 :param raw_data: 爬虫原始数据字典 :param target_key: 目标筛选关键词 :return: 过滤后的数据字典 """ # 提取文本内容,合并标题与正文综合判断 total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() # 判断关键词是否存在 if target_key in total_text: filter_data["status"] = "筛选通过" filter_data["hit_keyword"] = target_key else: filter_data["status"] = "已过滤(无目标关键词)" filter_data["hit_keyword"] = "" return filter_data # 联合基础爬虫进行测试 if __name__ == "__main__": from 上文模块 import get_raw_crawl_data test_url = "https://www.example.com" raw_result = get_raw_crawl_data(test_url) # 设置筛选关键词 filter_result = single_keyword_white_filter(raw_result, "科技") print(f"过滤结果状态:{filter_result['status']}") print(f"命中关键词:{filter_result['hit_keyword']}")
3.2.2 代码原理详解
  1. 文本合并逻辑:将网页标题与正文拼接后统一判断,原因是部分目标关键词仅出现在标题中,若只判断正文会造成正常数据误过滤,综合判断提升筛选准确率。
  2. 数据拷贝操作:使用copy()方法复制原始数据字典,而非直接引用,保证原始爬取数据不被修改,实现原始数据与过滤数据隔离,便于后续数据回溯。
  3. 状态字段扩展:在原有数据字典基础上新增statushit_keyword字段,明确数据状态与命中关键词,实现过滤结果可追溯。
  4. 匹配逻辑target_key in total_text底层基于 Python 字符串顺序遍历匹配,时间复杂度低,在百万字符级文本中依然可以保持极快的运行速度,适配高并发爬虫场景。

3.3 单关键词黑名单过滤

黑名单过滤即包含违规关键词则直接过滤内容,常用于敏感词拦截、广告内容、灌水文本、违规信息剔除,是爬虫合规性处理的核心模块。

3.3.1 代码实现

python

运行

def single_keyword_black_filter(raw_data: dict, ban_key: str) -> dict: """ 单关键词黑名单过滤:包含违规关键词则过滤数据 :param raw_data: 爬虫原始数据字典 :param ban_key: 黑名单违规关键词 :return: 过滤后的数据字典 """ total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() if ban_key in total_text: filter_data["status"] = f"已过滤(命中黑名单:{ban_key})" filter_data["hit_keyword"] = ban_key else: filter_data["status"] = "筛选通过" filter_data["hit_keyword"] = "" return filter_data # 测试调用 if __name__ == "__main__": from 上文模块 import get_raw_crawl_data test_url = "https://www.example.com" raw_result = get_raw_crawl_data(test_url) # 黑名单关键词:广告 filter_result = single_keyword_black_filter(raw_result, "广告") print(f"过滤结果:{filter_result['status']}")
3.3.2 代码原理详解

黑名单逻辑与白名单逻辑框架一致,仅判断分支相反。该模块核心优势为逻辑极简、无额外依赖,适合部署在爬虫解析环节的第一级粗过滤,在数据刚抓取完成时快速拦截明显违规内容,减少后续模块的计算压力。同时该方法不改变原始文本内容,仅做状态标记,保证数据完整性。

3.4 大小写与全角半角兼容处理

实际爬取的英文文本、混合文本中,存在大小写混用、全角符号替代半角符号的问题,直接匹配会出现漏判,因此需要增加文本标准化处理逻辑。

3.4.1 代码实现

python

运行

def text_standardize(text: str) -> str: """ 文本标准化:统一小写、全角转半角,兼容不规则文本 :param text: 原始文本 :return: 标准化后文本 """ # 全角字符转半角字符 full_char = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" half_char = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" trans_table = str.maketrans(full_char, half_char) std_text = text.translate(trans_table) # 英文字母统一转为小写 std_text = std_text.lower() return std_text def compatible_key_filter(raw_data: dict, key_word: str) -> dict: """ 兼容型关键词过滤:处理大小写、全角半角问题 """ total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() # 文本标准化 std_text = text_standardize(total_text) std_key = text_standardize(key_word) if std_key in std_text: filter_data["status"] = "筛选通过(兼容模式)" filter_data["hit_keyword"] = key_word else: filter_data["status"] = "已过滤(无匹配关键词)" filter_data["hit_keyword"] = "" return filter_data
3.4.2 代码原理详解
  1. 全角半角转换str.maketrans()生成字符映射表,translate()根据映射表批量替换字符,相比循环替换,该方法为底层 C 实现,批量字符转换性能提升数倍,适合长文本处理。
  2. 大小写统一lower()将所有英文字母转为小写,实现大小写不敏感匹配,解决PythonpythonPYTHON视为不同关键词的问题。
  3. 双向标准化:不仅处理爬取文本,同时对筛选关键词做标准化,保证匹配两端规则统一,彻底规避格式差异导致的匹配失效问题。

四、多关键词集合批量过滤实战

在真实项目中,业务规则往往不是单个关键词,而是数十个、上百个关键词组成的关键词库,例如行业词库、敏感词库、品牌词库。此时使用单关键词循环匹配效率低下,需要基于 ** 集合(set)** 实现批量关键词过滤,利用哈希查找的高性能特性提升筛选速度。

4.1 集合匹配的性能优势

Python 集合基于哈希表实现,成员判断x in set的时间复杂度为 O (1),而列表遍历判断x in list时间复杂度为 O (n)。当关键词数量达到 50 个以上、单条文本长度超过万字符时,集合匹配的性能优势会急剧放大。对于爬虫场景下的大批量数据过滤,集合是批量关键词存储的最优数据结构。

4.2 多关键词白名单过滤(任一匹配即通过)

业务需求:文本包含任意一个白名单关键词,即保留数据,适用于多品类、多标签内容筛选。

4.2.1 代码实现

python

运行

def multi_key_any_filter(raw_data: dict, key_set: set) -> dict: """ 多关键词过滤:命中任意一个关键词则通过 :param raw_data: 原始爬取数据 :param key_set: 关键词集合 :return: 过滤后数据 """ total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() hit_keys = [] # 遍历关键词集合,判断是否存在匹配 for key in key_set: if key in total_text: hit_keys.append(key) if hit_keys: filter_data["status"] = "筛选通过(命中多关键词)" filter_data["hit_keyword"] = ",".join(hit_keys) else: filter_data["status"] = "已过滤(未命中任何关键词)" filter_data["hit_keyword"] = "" return filter_data # 测试调用 if __name__ == "__main__": from 上文模块 import get_raw_crawl_data test_url = "https://www.example.com" raw_data = get_raw_crawl_data(test_url) # 定义白名单关键词集合 white_keys = {"人工智能", "大数据", "云计算", "区块链"} result = multi_key_any_filter(raw_data, white_keys) print(result["status"], result["hit_keyword"])
4.2.2 代码原理详解
  1. 集合入参设计:强制使用集合存储关键词,从数据结构层面保证查询性能,同时集合自动去重,避免关键词库重复冗余。
  2. 命中关键词收集:使用列表hit_keys收集所有命中的关键词,最终拼接为字符串存入数据字段,完整记录本次筛选的所有命中项,方便规则复盘。
  3. 逻辑判定:列表非空即代表存在匹配关键词,判定为筛选通过,逻辑简洁且执行效率高。

4.3 多关键词白名单过滤(全部匹配才通过)

业务需求:文本必须同时包含所有指定关键词,才保留数据,适用于精准定向内容抓取,例如同时包含 “手机”“旗舰”“5G” 三个词汇才判定为目标内容。

4.3.1 代码实现

python

运行

def multi_key_all_filter(raw_data: dict, key_set: set) -> dict: """ 多关键词过滤:必须命中所有关键词才通过 """ total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() # 遍历所有关键词,判断是否全部存在 all_hit = all(key in total_text for key in key_set) if all_hit: filter_data["status"] = "筛选通过(全部关键词命中)" filter_data["hit_keyword"] = ",".join(key_set) else: filter_data["status"] = "已过滤(未全部命中关键词)" filter_data["hit_keyword"] = "" return filter_data # 测试调用 if __name__ == "__main__": from 上文模块 import get_raw_crawl_data raw_data = get_raw_crawl_data("https://www.example.com") target_keys = {"手机", "旗舰", "5G"} res = multi_key_all_filter(raw_data, target_keys) print(res["status"])
4.3.2 代码原理详解
  1. all () 内置函数all(可迭代对象)会依次判断迭代对象中每一个元素是否为 True,全部为 True 时整体返回 True,任意一个为 False 则直接返回 False,是 Python 内置高效逻辑判断函数。
  2. 短路特性all()具备短路逻辑,当检测到第一个不匹配的关键词时,立即终止遍历,不再判断剩余关键词,减少无效计算。

4.4 大批量黑名单词库过滤

针对上千条敏感词、广告词的黑名单场景,结合集合与提前终止逻辑优化性能,实现高效拦截。

4.4.1 代码实现

python

运行

def big_black_words_filter(raw_data: dict, black_set: set) -> dict: """ 大批量黑名单词库过滤,命中任意关键词立即过滤 """ total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() for ban_key in black_set: if ban_key in total_text: filter_data["status"] = f"已过滤(命中黑名单:{ban_key})" filter_data["hit_keyword"] = ban_key return filter_data # 遍历完成无命中 filter_data["status"] = "筛选通过" filter_data["hit_keyword"] = "" return filter_data # 模拟大型黑名单词库 if __name__ == "__main__": black_word_lib = {"赌博", "色情", "诈骗", "刷单", "兼职赚钱", "低价引流"} raw_data = get_raw_crawl_data("https://www.example.com") res = big_black_words_filter(raw_data, black_word_lib) print(res["status"])
4.4.2 代码原理详解

该代码采用提前 return优化策略,遍历黑名单集合时,一旦命中违规关键词,立刻返回结果并终止循环,无需遍历剩余词库。在黑名单词库体量较大时,该优化能极大减少循环次数,是工程中标准的大批量黑名单过滤写法。

五、正则表达式高级过滤实战

基础字符串匹配仅能完成简单关键词判断,面对关键词组合、模糊匹配、特殊格式文本、模板化垃圾内容时能力不足。正则表达式(re 模块)依托规则语法实现复杂模式匹配,是爬虫中高级内容过滤的核心技术,适用于复杂文本场景。

5.1 re 模块基础使用与预编译优化

正则表达式每次匹配都需要解析语法规则,若在循环、批量数据场景下重复使用同一套正则规则,会产生大量重复解析开销。re.compile()可提前编译正则表达式,生成正则对象,后续直接调用对象方法完成匹配,大幅提升批量处理性能,这是爬虫正则过滤的必备优化手段。

5.2 关键词组合与模糊匹配过滤

实现 “关键词 A 和关键词 B 相隔任意字符”“关键词开头 / 结尾匹配” 等复杂规则,例如过滤标题以 “限时福利” 开头的广告内容。

5.2.1 代码实现

python

运行

import re # 预编译正则规则,全局复用 # 规则1:匹配标题以【广告】开头的内容 AD_RULE = re.compile(r"^【广告】.*", re.S) # 规则2:同时包含“优惠”和“折扣”两个关键词,顺序不限 DISCOUNT_RULE = re.compile(r"优惠.*折扣|折扣.*优惠", re.S) def regex_filter(raw_data: dict) -> dict: """ 正则表达式多规则过滤 """ total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() # 规则1:拦截广告标题 if AD_RULE.search(total_text): filter_data["status"] = "已过滤(正则匹配广告内容)" filter_data["hit_keyword"] = "【广告】" return filter_data # 规则2:拦截优惠灌水内容 if DISCOUNT_RULE.search(total_text): filter_data["status"] = "已过滤(正则匹配营销内容)" filter_data["hit_keyword"] = "优惠+折扣" return filter_data filter_data["status"] = "筛选通过" filter_data["hit_keyword"] = "" return filter_data # 测试 if __name__ == "__main__": raw_data = get_raw_crawl_data("https://www.example.com") res = regex_filter(raw_data) print(res["status"])
5.2.2 代码原理详解
  1. 正则预编译re.compile()在程序启动时仅执行一次,解析正则语法并生成机器可识别的匹配模型,后续search()调用直接使用模型,避免重复解析,批量处理上千条数据时性能提升 50% 以上。
  2. 正则修饰符 re.S:默认.通配符无法匹配换行符,re.S.匹配包括换行在内的所有字符,适配存在换行的长文本内容。
  3. ^ 锚点符^代表文本开头,精准匹配以指定字符开头的内容,实现定向拦截。
  4. .通配符*:.*代表匹配任意长度的任意字符,实现两个关键词之间存在任意内容的模糊匹配。

5.3 特殊字符与冗余内容剔除

网页文本常包含大量特殊符号、乱码、重复模板文本,使用正则批量清除这类冗余内容,完成文本清洗。

5.3.1 代码实现

python

运行

# 预编译规则:清除特殊符号、多余空格、换行 CLEAN_RULE = re.compile(r"[^\u4e00-\u9fa5a-zA-Z0-9\s]") SPACE_RULE = re.compile(r"\s+") def text_clean_filter(raw_data: dict) -> dict: """ 正则清洗文本+内容过滤 """ filter_data = raw_data.copy() content = filter_data["content"] # 第一步:清除非中英文、数字、空格的特殊符号 clean_content = CLEAN_RULE.sub("", content) # 第二步:将多个连续空格、换行替换为单个空格 clean_content = SPACE_RULE.sub(" ", clean_content) filter_data["content"] = clean_content filter_data["status"] = "文本清洗完成" return filter_data
5.3.2 代码原理详解
  1. 字符区间匹配\u4e00-\u9fa5是 Unicode 中文汉字区间,该规则保留中文、英文、数字、空格,剔除所有标点、乱码、特殊符号,实现文本标准化清洗。
  2. sub () 替换方法正则对象.sub(替换内容, 原文本)实现批量匹配替换,是文本清洗的核心方法。
  3. \s + 规则\s代表所有空白字符(空格、换行、制表符),+代表匹配一个及以上连续字符,将多处空白合并为单个空格,精简文本体积。

六、中文分词语义级精准过滤

基础匹配与正则均属于字符层面匹配,无法理解文本语义,存在明显短板:当关键词拆分、语句语序变化、使用近义词时,会出现漏判。例如目标关键词为 “人工智能”,文本中出现 “人工领域智能技术”,字符匹配无法识别,但语义高度相关。针对中文长文本、舆情分析、深度内容筛选场景,需要引入中文分词实现语义级过滤,本节使用 jieba 分词库实现该功能。

6.1 jieba 分词核心原理简述

jieba 是 Python 生态中使用最广泛的中文分词库,基于前缀词典实现高效词图扫描,结合隐马尔可夫模型处理未登录词(新词、网络词汇),支持精确模式、全模式、搜索引擎模式三种分词模式。在爬虫内容过滤中,优先使用精确模式,将文本切分为最合理的词语组合,保证语义完整性。

6.2 分词 + 关键词语义过滤实现

6.2.1 代码实现

python

运行

import jieba def semantic_filter(raw_data: dict, target_words: set) -> dict: """ 分词语义过滤:基于词语匹配,而非字符匹配 :param raw_data: 原始数据 :param target_words: 目标词语集合 :return: 过滤结果 """ total_text = raw_data["title"] + raw_data["content"] filter_data = raw_data.copy() # 精确模式分词,返回词语列表 word_list = list(jieba.lcut(total_text)) # 将分词列表转为集合,提升查询效率 word_set = set(word_list) # 判断分词结果与目标词集合是否存在交集 intersect = word_set & target_words if intersect: filter_data["status"] = "语义筛选通过" filter_data["hit_keyword"] = ",".join(intersect) else: filter_data["status"] = "语义过滤(无相关词汇)" filter_data["hit_keyword"] = "" return filter_data # 测试调用 if __name__ == "__main__": raw_data = get_raw_crawl_data("https://www.example.com") # 目标语义关键词 semantic_keys = {"人工智能", "机器学习", "深度学习"} res = semantic_filter(raw_data, semantic_keys) print(res["status"], res["hit_keyword"])
6.2.2 代码原理详解
  1. 分词逻辑jieba.lcut()为精确分词模式,将整段中文文本按照语义切分为独立词语,例如 “人工智能技术” 切分为["人工智能", "技术"],从语义维度拆分文本。
  2. 集合交集判断:将分词结果转为集合,使用集合按位与&求取两个集合的交集,交集非空则代表文本包含目标语义词汇,该方式相比循环遍历效率更高。
  3. 语义优势:该方式规避了字符匹配的缺陷,即使词语穿插其他字符,只要核心词汇存在,即可正常匹配,适合资讯、舆情、文章类长文本爬虫。

6.3 自定义分词词库优化

行业爬虫存在大量专业术语、专有名词,jieba 默认词库无法精准拆分,可加载自定义词库提升分词准确率,进一步优化语义过滤效果。

python

运行

# 加载自定义分词词库(行业专业词汇) jieba.load_userdict("user_dict.txt") # 后续分词逻辑不变,分词精度针对行业词汇优化

原理:自定义词库会优先于默认词库进行匹配,强制将专业术语识别为完整词语,避免专业词汇被错误拆分,保证行业场景下过滤的准确性。

七、多级过滤架构设计与工程化整合

单一过滤方式无法满足工业化爬虫项目需求,结合前文所有技术,搭建粗过滤→正则清洗→精过滤→语义过滤四级分层架构,兼顾性能、准确率与可维护性,同时整合日志、配置、异常处理,形成完整可落地的过滤模块。

7.1 多级过滤架构流程

  1. 一级粗过滤:多关键词黑名单集合过滤,快速拦截明显违规内容,低性能消耗,过滤 80% 以上无效数据。
  2. 二级文本清洗:正则表达式清除特殊符号、冗余空格、模板垃圾文本,标准化文本格式。
  3. 三级精过滤:正则表达式完成复杂规则、组合关键词匹配,处理精细化业务规则。
  4. 四级语义过滤:中文分词 + 语义关键词匹配,完成高精准度内容筛选,适配深度业务需求。

7.2 完整多级过滤整合代码

python

运行

import re import jieba import logging # 配置日志,记录过滤日志 logging.basicConfig(filename="crawl_filter.log", level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") # 全局规则配置(模拟配置文件,实际项目可写入json/ini配置) BLACK_KEY_SET = {"赌博", "诈骗", "色情", "刷单"} WHITE_KEY_SET = {"人工智能", "大数据", "云计算"} REG_AD_RULE = re.compile(r"限时.*抢购|今日特价", re.S) # 预编译正则清洗规则 CLEAN_RULE = re.compile(r"[^\u4e00-\u9fa5a-zA-Z0-9\s]") SPACE_RULE = re.compile(r"\s+") # 一级过滤:黑名单粗过滤 def first_filter(data): for key in BLACK_KEY_SET: if key in data["title"] + data["content"]: logging.info(f"一级过滤命中黑名单:{key},链接:{data['url']}") data["status"] = f"一级过滤:命中{key}" return False, data return True, data # 二级过滤:正则文本清洗 def second_filter(data): content = data["content"] content = CLEAN_RULE.sub("", content) content = SPACE_RULE.sub(" ", content) data["content"] = content return True, data # 三级过滤:正则精过滤 def third_filter(data): text = data["title"] + data["content"] if REG_AD_RULE.search(text): logging.info(f"三级过滤命中营销内容,链接:{data['url']}") data["status"] = "三级过滤:命中营销广告" return False, data return True, data # 四级过滤:分词语义过滤 def fourth_filter(data): text = data["title"] + data["content"] word_list = list(jieba.lcut(text)) word_set = set(word_list) intersect = word_set & WHITE_KEY_SET if not intersect: logging.info(f"四级过滤无目标语义词汇,链接:{data['url']}") data["status"] = "四级过滤:无目标内容" return False, data data["status"] = "全部过滤通过" data["hit_keyword"] = ",".join(intersect) logging.info(f"数据筛选通过,命中词汇:{intersect},链接:{data['url']}") return True, data # 统一入口:多级过滤总函数 def full_multi_filter(raw_data): # 逐级执行过滤,某一级失败则终止流程 flag, data = first_filter(raw_data) if not flag: return data flag, data = second_filter(data) if not flag: return data flag, data = third_filter(data) if not flag: return data flag, data = fourth_filter(data) return data # 整体测试 if __name__ == "__main__": raw = get_raw_crawl_data("https://www.example.com") final_result = full_multi_filter(raw) print("最终过滤结果:", final_result["status"]) print("命中关键词:", final_result["hit_keyword"])

7.3 架构设计原理与工程说明

  1. 逐级终止机制:每一级过滤判断失败后,直接返回结果并终止后续流程,避免无效计算,最大化提升整体运行效率。
  2. 日志系统集成:引入 logging 模块记录每一条数据的过滤状态、命中关键词、目标链接,实现全流程可追溯,便于线上问题排查与规则迭代。
  3. 规则解耦:所有关键词、正则规则统一放在全局配置区,后期修改过滤规则无需改动业务逻辑代码,符合可配置设计原则。
  4. 模块拆分:每一级过滤拆分为独立函数,代码结构清晰,单人维护、团队协作、功能扩展都更加便捷。

八、性能优化、异常处理与线上部署建议

8.1 性能优化方案

  1. 规则预编译:所有正则表达式、分词词库在程序初始化阶段加载编译,禁止在循环、单次数据处理中动态编译,减少重复开销。
  2. 数据类型优选:关键词库统一使用集合(set)存储,杜绝列表、元组等低效结构,保证成员判断速度。
  3. 文本截断优化:对于超长网页文本,可截取标题 + 前 500 字符进行关键词判断,绝大部分核心关键词都会出现在文本前部,大幅减少字符运算量。
  4. 缓存分词结果:对于重复站点、重复模板文本,缓存分词结果,避免重复分词计算。

8.2 异常处理补充

在线上爬虫运行过程中,文本为空、编码异常、分词报错等问题时有发生,需增加边界判断:

  1. 过滤前判断titlecontent是否为空,空文本直接标记为过滤。
  2. 对分词逻辑增加异常捕获,防止特殊字符导致 jieba 分词崩溃。
  3. 限制单条文本最大长度,避免超大文本造成内存占用过高。

8.3 线上部署规范

  1. 规则外置:将黑白名单关键词、正则规则、过滤等级全部存入外部配置文件(JSON、YAML、数据库),支持动态更新。
  2. 分环境配置:开发环境、测试环境、生产环境使用不同的过滤规则,避免测试规则影响线上数据。
  3. 流量监控:统计每一级过滤的拦截数据量,分析无效数据占比,反向优化爬虫抓取范围与过滤规则。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询