当前位置: 首页 > news >正文

爬虫结合AI实战:自动提取网页正文并生成高质量结构化摘要

做资讯聚合、知识库建设、行业舆情监控这类项目时,传统爬虫只能拉回一堆混杂着广告、导航、无关推荐的HTML源码,后续的正文提纯、内容摘要、信息结构化全靠人工整理,效率极低;而简单粗暴地把整页HTML丢给大模型处理,又会遇到Token成本飙升、摘要逻辑混乱、输出格式不可控的问题。

落地一套可用的AI摘要系统,核心不是“爬虫调个大模型API”这么简单,而是要做全链路的工程化优化:先把网页里的无效信息砍掉80%,再通过语义分片解决长文本上下文限制,最后用结构化Prompt约束输出质量。我们在内部资讯聚合项目中落地这套方案后,人工整理成本下降80%,单篇处理成本降低60%,摘要信息合格率从62%提升到94%。

本文从架构设计、正文提纯、分片策略、Prompt优化到工程落地,完整拆解可复现的全流程实现方案。

一、整体架构:为什么不能是“爬虫+直接调API”

很多人做的第一版AI摘要,就是爬虫抓完页面,直接把HTML字符串塞给大模型,一句“帮我总结”了事。这种简陋方案在生产环境里完全站不住脚。

1.1 简陋方案的三大致命问题

  1. 成本极高:普通资讯页的HTML源码包含大量标签、样式、广告、导航代码,有效正文占比通常不足20%。一篇5000字的文章,HTML对应的Token量可能超过3万,绝大部分都是无效开销。
  2. 质量极差:大模型会被广告、相关推荐、页面噪音干扰,摘要里经常混入无关信息,甚至出现“小编推荐”“点击关注”这类不属于正文的内容。
  3. 稳定性差:长网页直接超出模型上下文限制,报错截断;不同网站的页面结构差异大,输出质量波动极大,完全不可控。

1.2 全链路优化架构

工业级落地需要六层处理逻辑,逐层收敛输入、控制输出质量,整体流程如下:

URL输入

网页抓取
静态/动态页兼容

正文提纯
剔除标签/广告/噪音

内容清洗
过滤无效段落/格式归一

语义分片
长文按语义切块

AI摘要生成
结构化Prompt约束

结果校验
格式/内容合规检查

结构化存储

核心优化思路是:能靠规则解决的,绝不消耗大模型Token。把清洗、提纯、分片这些前置工作做扎实,后面的AI生成环节才能又快又省又准。

二、正文精准提纯:先砍掉80%无效Token

这是整个流程里投入产出比最高的一步。不要自己写正则、写XPath去抠正文,换个网站规则就失效,维护成本极高。工业界有成熟的正文提取工具,专门做噪音过滤,效果远胜手写规则。

2.1 工具选型:trafilatura 优于 newspaper3k

主流的Python正文提取库有两个,实测差异非常明显:

  • newspaper3k:老牌库,适配英文站效果不错,中文站提取率偏低,经常漏段落、混入广告。
  • trafilatura:专注正文提取,支持多语言,对中文资讯、博客、新闻页的适配度极高,能精准识别导航、广告、相关推荐、版权声明并剔除,提取准确率比前者高30%以上。

安装非常简单:

pipinstalltrafilatura requests

2.2 基础提取实现

只需要几行代码,就能拿到纯净的正文文本,自动剔除HTML标签、广告、导航栏、页脚信息:

importtrafilaturaimportrequestsdeffetch_clean_text(url:str)->str:"""抓取网页并提取纯净正文"""try: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"}resp=requests.get(url,headers=headers,timeout=15)resp.encoding=resp.apparent_encoding html=resp.text# 核心:提取正文,自动过滤噪音text=trafilatura.extract(html,include_links=False,# 剔除链接include_images=False,# 剔除图片include_tables=True,# 保留表格内容deduplicate=True# 去重重复段落)returntextiftextelse""exceptExceptionase:print(f"网页抓取失败{url}:{str(e)}")return""

实测下来,一篇普通资讯页,原始HTML约2.8万Token,提取后的正文仅约5000Token,无效内容剔除率超过80%,单篇处理成本直接降了四倍。

2.3 二次清洗:进一步压缩无效内容

提取后的正文里,还可能残留“免责声明”“版权所有”“转载请注明”“相关推荐”这类固定模板内容,需要再做一次规则清洗:

  1. 短段落过滤:少于10个字的段落直接丢弃,大多是分割线、空行、小标题碎片。
  2. 关键词黑名单:匹配“免责声明”“版权声明”“本文转载”“关注我们”这类固定话术,整段剔除。
  3. 格式归一:去掉多余的换行、空格,统一段落分隔,避免无意义的空白占用Token。
defclean_text(text:str)->str:"""正文二次清洗"""blacklist=["免责声明","版权声明","转载请注明","来源:","作者:","关注我们"]lines=text.split("\n")clean_lines=[]forlineinlines:line=line.strip()# 过滤过短行iflen(line)<10:continue# 过滤黑名单内容ifany(wordinlineforwordinblacklist):continueclean_lines.append(line)return"\n".join(clean_lines)

三、长文本语义分片:解决上下文超限问题

短文章可以直接丢给大模型,但行业报告、深度长文动辄上万字,很容易超出模型的上下文窗口。粗暴按字符数硬切,会把完整语义拆断,导致摘要失真、信息遗漏。

3.1 语义优先的分片策略

正确的分片逻辑是按段落语义分组,而不是按固定字符数切割:

  1. 以自然段落为最小单位,不拆分单段内容。
  2. 按Token数累加,达到阈值就切分为一个分片。
  3. 相邻分片保留1~2个段落的重叠,避免语义断层。
  4. 优先按标题、空行等天然分隔点切分。

可以用tiktoken精准计算Token数,控制每个分片的大小在模型窗口的70%以内,预留空间给Prompt和输出。

importtiktoken encoder=tiktoken.encoding_for_model("gpt-3.5-turbo")defcount_tokens(text:str)->int:"""计算文本Token数"""returnlen(encoder.encode(text))defsemantic_split(text:str,max_tokens:int=3000,overlap:int=1)->list:"""语义分片:按段落切,保留重叠"""paragraphs=[pforpintext.split("\n")ifp.strip()]chunks=[]current_chunk=[]current_len=0forparainparagraphs:para_len=count_tokens(para)ifcurrent_len+para_len>max_tokensandcurrent_chunk:chunks.append("\n".join(current_chunk))# 保留重叠段落current_chunk=current_chunk[-overlap:]ifoverlap>0else[]current_len=sum(count_tokens(p)forpincurrent_chunk)current_chunk.append(para)current_len+=para_lenifcurrent_chunk:chunks.append("\n".join(current_chunk))returnchunks

3.2 长文摘要的 Map-Reduce 思路

超过一万字的长文,不要指望一次生成完整摘要,信息密度会非常差。推荐用两段式生成:

  1. Map阶段:每个分片各自生成局部摘要,提炼该部分的核心信息。
  2. Reduce阶段:把所有局部摘要汇总,再生成一次全文摘要,保证整体逻辑连贯。

这种方式既能处理任意长度的文本,又能保证摘要的信息覆盖率,比硬塞全文的效果好很多。

四、Prompt工程:让输出稳定、可控、符合业务需求

大模型输出质量波动,90%的原因是Prompt写得太随意。一句“帮我总结一下”,等于把所有控制权都交给了模型,结果自然不可控。

4.1 高质量Prompt的四个核心要素

  1. 角色明确:给模型设定具体身份,比如“资深资讯编辑”“行业分析师”,让输出风格匹配场景。
  2. 格式固定:明确要求输出结构,比如总分结构、分点罗列、JSON格式,方便后续解析存储。
  3. 约束清晰:限定字数、禁止编造、要求只基于原文、保留关键数据,减少幻觉。
  4. 范围限定:明确摘要的侧重点,比如技术要点、商业信息、事件时间线,不要泛泛而谈。

4.2 三类即用型Prompt模板

模板1:通用资讯摘要(适合新闻、博客)
你是一名资深资讯编辑,请根据以下文章内容,生成一份精简摘要。 要求: 1. 不超过200字,分3句话以内表述 2. 提炼核心事件、关键数据、核心结论 3. 只基于原文内容,不得编造信息,不要加入主观评价 4. 保留时间、主体、核心结果三个关键要素 文章内容: {content} 摘要:
模板2:技术文章结构化摘要(适合技术博客、文档)
你是一名技术编辑,请根据以下技术文章,输出结构化摘要。 严格按照JSON格式返回,包含以下字段: - "core_topic": 文章核心主题,15字以内 - "key_points": 核心技术要点,数组形式,3-5条 - "tech_stack": 涉及的技术栈,数组形式 - "conclusion": 文章结论,50字以内 注意:所有内容必须完全来自原文,不得补充编造。 文章内容: {content}
模板3:行业报告深度摘要(适合长文、报告)
你是一名行业分析师,请根据报告内容生成深度摘要。 要求: 1. 先给出一句话核心结论 2. 分3个维度展开分析:行业现状、核心趋势、风险与机会 3. 保留原文中的关键数据、百分比、排名信息 4. 总字数控制在500字以内 报告内容: {content}

4.3 强制结构化输出技巧

要让100%的请求都返回标准JSON,不要靠模型自觉,要用工具调用(Function Calling)或者官方JSON模式约束。以OpenAI兼容接口为例:

fromopenaiimportOpenAI client=OpenAI(api_key="your_api_key",base_url="your_base_url"# 国内模型通用兼容格式)defgenerate_summary(text:str)->dict:"""生成结构化摘要,强制JSON输出"""response=client.chat.completions.create(model="gpt-4o-mini",response_format={"type":"json_object"},# 强制JSON模式temperature=0.3,# 降低随机性,保证输出稳定messages=[{"role":"system","content":"你是专业的内容摘要助手,严格按照JSON格式输出摘要结果,包含title、summary、keywords三个字段。"},{"role":"user","content":f"请为以下文章生成摘要:\n{text}"}])returneval(response.choices[0].message.content)# 生产环境建议用json.loads

temperature调低到0.2~0.4,可以大幅降低输出的随机性,相同内容多次调用的结果一致性会明显提升,非常适合生产环境。

五、工程化落地:批量处理、成本控制与容错

单篇跑通只是开始,批量处理几万、几十万篇网页,还要考虑性能、成本、稳定性。

5.1 接入Scrapy Pipeline:批量自动化处理

如果是用Scrapy做批量爬虫,只需加一个自定义Pipeline,就能实现每抓取一篇文章,自动生成摘要并存库:

# pipelines.pyclassAISummaryPipeline:defprocess_item(self,item,spider):ifitem.get("content"):# 清洗正文clean_content=clean_text(item["content"])# 生成摘要summary_result=generate_summary(clean_content)# 回填到itemitem["summary"]=summary_result.get("summary","")item["keywords"]=summary_result.get("keywords",[])item["ai_title"]=summary_result.get("title",item["title"])returnitem

5.2 成本优化:把Token开销打下来

  1. 前置清洗做到极致:能在规则层去掉的内容,绝对不留给大模型。正文提纯这一步,已经能省掉70%以上的Token成本。
  2. 分级调用模型:普通短资讯用轻量模型(如gpt-4o-mini、通义千问轻量版),成本只有大模型的十分之一;深度长文、重要报告再用强模型。
  3. 结果缓存:相同URL、相同内容的文章,只生成一次摘要,结果存缓存库,重复抓取直接复用。资讯聚合类场景,缓存命中率能到40%以上。
  4. 控制输出长度:Prompt里严格限制字数,输出越少,成本越低,速度也越快。

5.3 容错与降级

大模型API不是100%稳定,必须有降级方案:

  • 重试机制:接口超时、报错时,指数退避重试2次,不要直接失败。
  • 降级方案:连续调用失败时,自动降级为TextRank算法提取关键词+截取首段的简易摘要,保证流程不中断。
  • 结果校验:返回结果做格式检查,如果不是合法JSON、或者字数异常,就重生成一次,避免脏数据入库。

六、落地踩坑总结

  1. 不要直接喂HTML给大模型。这是新手最容易犯的错,既浪费钱,效果又差,正文提纯是必做环节。
  2. 不要迷信大模型能力。规则能搞定的清洗、格式化、过滤,就不要消耗模型能力,大模型只做最核心的语义提炼。
  3. 幻觉问题无法完全消除,但可以大幅降低。Prompt里强调“只基于原文”“禁止编造”,配合低temperature,再加上结果校验,能把幻觉出现率降到1%以下。
  4. 中文场景优先选中文原生模型。很多人默认用GPT,但国内模型对中文语境、行业黑话的理解更好,价格也更便宜,比如通义千问、文心一言的轻量版,处理中文摘要的性价比很高。

七、进阶拓展方向

这套基础方案跑通后,可以继续拓展更多能力:

  • 多模态摘要:结合页面中的图片、图表,生成图文结合的摘要,适合报告、评测类内容。
  • 实体与标签提取:让大模型同时提取文章中的人物、机构、事件,自动打分类标签,支撑内容检索。
  • 多文档聚合:把同一主题的多篇文章汇总,生成行业动态周报、事件全景梳理。

最后提醒:所有网页抓取与内容处理,都要严格遵守《网络安全法》与版权相关规定,仅采集公开合法数据,尊重原作者权益,不得用于商业侵权用途。

http://www.cnnetsun.cn/news/3757539.html

相关文章:

  • 分布式一致性协议:从Paxos到Raft
  • UDF格式文件是什么?如何正确打开udf文件——用「软领Win解压缩」轻松处理
  • PDF-Lib深度解析:现代JavaScript环境下的PDF处理技术实现
  • Windows 11终极优化指南:Win11Debloat让你的系统飞起来
  • 高级屏幕翻译工具深度解析:Linux用户的智能语言助手实战指南
  • AI生成UI组件库不是替代设计师,而是重构协作范式——20年UX工程实践证实的3层人机协同黄金比例
  • WordPress网站迁移终极解决方案:All-In-One WP Migration With Import完整指南
  • 差分高速线路设计高频踩坑点避坑指南
  • Loop:如何用3个简单步骤彻底改变你的macOS窗口管理体验
  • 解锁QQ音乐高品质资源:MCQTSS_QQMusic解析工具全攻略
  • 绝区零一条龙:5分钟快速上手指南,免费解放双手的终极自动化助手
  • 微信红包助手:让红包自动飞入你口袋的终极神器
  • BilibiliDown:3分钟学会B站视频下载的终极指南
  • 执行docker run **提示:Error response from daemon: Get “https://registry-1.docker.io/v2/net/request cance
  • 如何避开智能体开发陷阱?2026全栈式AI智能体服务商选型指南
  • Claudia布局系统:打造灵活响应式界面的终极指南
  • Linux 二进制分析利器:strings 命令从入门到实战全解
  • 为什么选择InboxLayout?5个理由让你的App手势体验超越竞品
  • basic-ftp源码探秘:Typescript实现的FTP协议解析原理
  • WinBtrfs实战指南:Windows平台Btrfs文件系统完全手册
  • 为什么选择SVG2TikZ?5大优势助你轻松生成高质量LaTeX图形代码
  • 如何快速获取QQ音乐资源:MCQTSS_QQMusic解析工具完全指南
  • CC27xx无线MCU架构解析:Cortex-M33与HSM协同设计实现物联网安全与低功耗
  • 粉笔公考980网课有效期多久能看几年
  • 霸王餐API接口对接数据加密:Java实现RSA+AOP组合的请求响应自动加解密方案
  • 多语言支持轻松实现:shadcn-docs-nuxt国际化(i18n)配置全攻略
  • enumerate 的用法
  • CocoaPods-Rome:让Xcode外框架构建变得前所未有的简单
  • CPSW以太网交换机网络统计机制:从硬件计数器到网络诊断实战
  • 如何让PDF文档在小屏幕上获得最佳阅读体验?Briss 2.0的智能裁剪解决方案