平时做项目或者写爬虫的时候,我们经常需要获取一些特定名词的背景资料。很多开发者的第一反应是:写个 requests 请求,去把网页抓下来,然后再用 BeautifulSoup 一层一层去解析 HTML 标签。这不仅费事,提取出来的文本往往还夹杂着一堆乱码和无用标签,如果碰到页面结构改版,代码当场就得罢工。
其实,对于获取百科知识,完全没必要这么折腾。Python 生态里早就提供了一个极其优雅的接口库,名字非常直白,就叫 wikipedia。它把底层的 API 请求和繁杂的文本解析工作全包了,你只需要关心你想查什么词条就行。
今天就带大家彻底搞懂这个库的各种用法,顺便写个可以直接拿去用的自动化脚本。
第一步:安装
老规矩,直接在终端里用 pip 安装:
核心逻辑梳理
在深入敲代码之前,我们先理清这个库的核心工作机制。非常简单明了,你可以把它当成一个自动化的浏览器操作过程,整个流程如下:
graph TD A[开始请求] --> B[设置语言环境 set_lang] B --> C[输入关键词模糊搜索 search] C --> D{是否确切知道词条全名?} D -->|否| E[从搜索返回的列表中挑选匹配项] D -->|是| F[获取摘要 summary 或 完整页面 page] E --> F F --> G[直接提取纯文本、链接、坐标等属性] G --> H[保存或处理数据]
基础操作:搜索与获取摘要
我们先来看最常见的场景。假如你想搜某个技术概念,但不太确定它在维基百科上的标准命名是什么。
import wikipedia# 默认语言是英文,如果我们需要抓取中文资料,第一步必须先切换语言wikipedia.set_lang("zh")# 模糊搜索关键词results = wikipedia.search("自然语言处理")print("搜索结果列表:")print(results)
这段代码会返回一个列表,包含了所有和“自然语言处理”相关的词条名称。拿到确切的词条名称后,就可以直接提取它的摘要了。摘要通常是百科页面最开头的那一两段话,用来做名词解释再合适不过。
# 获取特定词条的摘要# sentences 参数非常实用,它可以直接限制返回的句子数量,避免抓取的内容太冗长summary_text = wikipedia.summary("自然语言处理", sentences=2)print("\n词条摘要:")print(summary_text)
进阶操作:提取完整的页面数据
如果你需要的不仅仅是两句话的解释,而是需要整个页面的纯净文本、页面里引用的外部链接、甚至是相关资源的 URL,这时候就要用到核心的 page 方法了。
import wikipediawikipedia.set_lang("zh")try: # 获取整个页面的对象 tech_page = wikipedia.page("机器学习") # 1. 获取完整的纯文本内容 # 注意:这里拿到的已经是去掉了所有HTML标签的干净文本 content = tech_page.content print("完整内容前150个字符:") print(content[:150], "...\n") # 2. 获取当前词条的绝对链接地址 url = tech_page.url print("页面源链接:", url) # 3. 获取页面内包含的所有外部参考链接 references = tech_page.references print("底部参考链接数量:", len(references))except wikipedia.exceptions.DisambiguationError as e: # 这是新手最容易踩坑的地方:消歧义 # 比如你搜“苹果”,系统不知道你要的是水果还是科技公司,就会抛出这个异常 print("该词条存在歧义,维基百科给出的可能选项有:") print(e.options)except wikipedia.exceptions.PageError: print("抱歉,找不到对应的词条页面")
这里必须强调一下 DisambiguationError 这个异常处理。在实际跑批处理的时候,经常会遇到多义词导致程序中断,加上这个 try-except 块,能让你的代码健壮性提升一个档次。
实战演练:写一个批量资料搜集器
光看零散的 API 没意思,我们把上面的功能缝合一下,写一个自动化的小工具。这个脚本的功能是:传入一组需要调研的关键词,它会自动去搜索最匹配的词条,提取核心介绍,并统一整理保存到一个文本文件里。
import wikipediaimport timedef batch_fetch_knowledge(keywords, output_file): wikipedia.set_lang("zh") with open(output_file, "w", encoding="utf-8") as f: for keyword in keywords: print(f"正在努力抓取: {keyword}...") try: # 先搜索最匹配的词条 search_results = wikipedia.search(keyword) if not search_results: f.write(f"【{keyword}】: 未找到任何相关词条\n\n") continue # 默认取搜索结果的第一个作为最佳匹配 best_match = search_results[0] # 获取两句核心摘要 summary = wikipedia.summary(best_match, sentences=2) # 格式化写入文件 f.write(f"主题:{keyword} (匹配词条: {best_match})\n") f.write(f"内容:{summary}\n") f.write("-" * 50 + "\n\n") except wikipedia.exceptions.DisambiguationError as e: f.write(f"【{keyword}】: 词条存在歧义,需要更具体的描述。候选词条: {e.options[:3]}\n\n") except Exception as e: f.write(f"【{keyword}】: 抓取失败,系统报错: {str(e)}\n\n") # 加上一点延迟,做个文明的爬虫,避免给对方服务器造成压力 time.sleep(1) print(f"\n大功告成!所有资料已安全存入 {output_file}")# 跑起来测试一下target_keywords = ["HTTP/3", "区块链", "詹姆斯·韦伯空间望远镜"]batch_fetch_knowledge(target_keywords, "tech_research_data.txt")
这个库其实并没有多么高深莫测的底层逻辑,它最大的价值在于帮我们屏蔽了那些毫无营养的重复性劳动。如果你的日常工作或者个人项目里需要引入百科类的外部知识字典,这个库绝对是首选方案。不用去折腾正则匹配,不用头疼怎么清洗数据,直接调包,几行代码就能把结构化的知识拉到本地。
编辑:余文彬
审校:余雨馨