在当今信息爆炸的时代,知识图谱作为一种结构化的知识表示方式,被广泛应用于搜索引擎、推荐系统、智能问答等领域。百度百科作为中文互联网上最大的百科全书,包含了丰富的知识信息。通过爬取百度百科词条内容,可以构建一个知识图谱,为后续的数据分析和应用提供基础。
本文将详细介绍如何使用 Python 爬虫技术,从百度百科中提取词条内容,并将其结构化存储,以便后续的知识图谱构建。
在开始之前,需要确保已经安装了以下 Python 库:
requests
:用于发送 HTTP 请求。BeautifulSoup
:用于解析 HTML 文档。pandas
:用于数据存储和处理。sqlite3
:用于将数据存储到 SQLite 数据库中。可以通过以下命令安装这些库:
pip install requests beautifulsoup4 pandas
百度百科的每个词条都有一个唯一的 URL,例如“Python”词条的 URL 为 https://baike.baidu.com/item/Python
。我们的目标是从这些 URL 中提取词条的标题、简介、正文内容等信息。
首先,使用 requests
库发送 HTTP 请求,获取词条页面的 HTML 内容。
import requests
url = 'https://baike.baidu.com/item/Python'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
html_content = response.content
使用 BeautifulSoup
解析 HTML 内容,提取词条的标题、简介和正文内容。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
# 提取标题
title = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').find('h1').text
# 提取简介
summary = soup.find('div', class_='lemma-summary').text.strip()
# 提取正文内容
content = soup.find('div', class_='main-content').text.strip()
在提取到的内容中,可能会包含一些不需要的字符或标签。可以使用正则表达式或其他方法进行数据清洗。
import re
# 去除多余的空格和换行符
summary = re.sub(r'\s+', ' ', summary)
content = re.sub(r'\s+', ' ', content)
将提取到的数据存储到结构化数据库中,以便后续的分析和应用。这里使用 SQLite 数据库进行存储。
首先,创建一个 SQLite 数据库,并定义一个表来存储词条信息。
import sqlite3
conn = sqlite3.connect('baike.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS entries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
summary TEXT,
content TEXT
)
''')
conn.commit()
将提取到的词条信息插入到数据库中。
cursor.execute('''
INSERT INTO entries (title, summary, content) VALUES (?, ?, ?)
''', (title, summary, content))
conn.commit()
可以从数据库中查询存储的词条信息。
cursor.execute('SELECT * FROM entries')
rows = cursor.fetchall()
for row in rows:
print(row)
为了构建一个完整的知识图谱,需要爬取多个词条的内容。可以通过遍历一个词条列表,批量爬取并存储数据。
假设有一个包含多个词条名称的列表。
entries = ['Python', 'Java', 'C++', 'JavaScript', 'HTML']
遍历词条列表,依次爬取每个词条的内容,并存储到数据库中。
for entry in entries:
url = f'https://baike.baidu.com/item/{entry}'
response = requests.get(url, headers=headers)
html_content = response.content
soup = BeautifulSoup(html_content, 'html.parser')
title = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').find('h1').text
summary = soup.find('div', class_='lemma-summary').text.strip()
content = soup.find('div', class_='main-content').text.strip()
summary = re.sub(r'\s+', ' ', summary)
content = re.sub(r'\s+', ' ', content)
cursor.execute('''
INSERT INTO entries (title, summary, content) VALUES (?, ?, ?)
''', (title, summary, content))
conn.commit()
为了便于后续的数据分析,可以将数据库中的数据导出为 CSV 文件。
import pandas as pd
df = pd.read_sql_query('SELECT * FROM entries', conn)
df.to_csv('baike_entries.csv', index=False)
在获取了结构化的词条数据后,可以进一步构建知识图谱。知识图谱的构建通常包括实体识别、关系抽取、图数据库存储等步骤。
实体识别是指从文本中识别出具有特定意义的实体,如人名、地名、组织名等。可以使用自然语言处理技术进行实体识别。
import jieba.posseg as pseg
text = "Python 是一种广泛使用的高级编程语言。"
words = pseg.cut(text)
for word, flag in words:
if flag == 'n': # 名词
print(word)
关系抽取是指从文本中识别出实体之间的关系。可以使用规则匹配或机器学习方法进行关系抽取。
# 示例:简单的规则匹配
text = "Python 是由 Guido van Rossum 创造的。"
if '创造' in text:
print('Guido van Rossum 创造了 Python')
将识别出的实体和关系存储到图数据库中,如 Neo4j。可以使用 py2neo
库与 Neo4j 进行交互。
from py2neo import Graph, Node, Relationship
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
# 创建节点
python = Node("Language", name="Python")
guido = Node("Person", name="Guido van Rossum")
# 创建关系
created = Relationship(guido, "CREATED", python)
# 将节点和关系添加到图数据库
graph.create(created)
本文详细介绍了如何使用 Python 爬虫技术,从百度百科中提取词条内容,并将其结构化存储。通过批量爬取多个词条的内容,可以构建一个知识图谱,为后续的数据分析和应用提供基础。在实际应用中,还可以结合自然语言处理技术,进一步挖掘文本中的实体和关系,丰富知识图谱的内容。