Python 爬虫实战:爬取百度百科词条内容(知识图谱数据提取与结构化存储)

一、引言

在当今信息爆炸的时代,知识图谱作为一种结构化的知识表示方式,被广泛应用于搜索引擎、推荐系统、智能问答等领域。百度百科作为中文互联网上最大的百科全书,包含了丰富的知识信息。通过爬取百度百科词条内容,可以构建一个知识图谱,为后续的数据分析和应用提供基础。

本文将详细介绍如何使用 Python 爬虫技术,从百度百科中提取词条内容,并将其结构化存储,以便后续的知识图谱构建。

二、环境准备

在开始之前,需要确保已经安装了以下 Python 库:

  • requests:用于发送 HTTP 请求。
  • BeautifulSoup:用于解析 HTML 文档。
  • pandas:用于数据存储和处理。
  • sqlite3:用于将数据存储到 SQLite 数据库中。

可以通过以下命令安装这些库:

pip install requests beautifulsoup4 pandas

三、爬取百度百科词条内容

百度百科的每个词条都有一个唯一的 URL,例如“Python”词条的 URL 为 https://baike.baidu.com/item/Python。我们的目标是从这些 URL 中提取词条的标题、简介、正文内容等信息。

1、发送 HTTP 请求

首先,使用 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

2、解析 HTML 内容

使用 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()

3、数据清洗

在提取到的内容中,可能会包含一些不需要的字符或标签。可以使用正则表达式或其他方法进行数据清洗。

import re

# 去除多余的空格和换行符
summary = re.sub(r'\s+', ' ', summary)
content = re.sub(r'\s+', ' ', content)

四、结构化存储

将提取到的数据存储到结构化数据库中,以便后续的分析和应用。这里使用 SQLite 数据库进行存储。

1、创建数据库表

首先,创建一个 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()

2、插入数据

将提取到的词条信息插入到数据库中。

cursor.execute('''
INSERT INTO entries (title, summary, content) VALUES (?, ?, ?)
''', (title, summary, content))
conn.commit()

3、查询数据

可以从数据库中查询存储的词条信息。

cursor.execute('SELECT * FROM entries')
rows = cursor.fetchall()
for row in rows:
    print(row)

五、批量爬取词条内容

为了构建一个完整的知识图谱,需要爬取多个词条的内容。可以通过遍历一个词条列表,批量爬取并存储数据。

1、词条列表

假设有一个包含多个词条名称的列表。

entries = ['Python', 'Java', 'C++', 'JavaScript', 'HTML']

2、批量爬取

遍历词条列表,依次爬取每个词条的内容,并存储到数据库中。

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)

七、知识图谱构建

在获取了结构化的词条数据后,可以进一步构建知识图谱。知识图谱的构建通常包括实体识别、关系抽取、图数据库存储等步骤。

1、实体识别

实体识别是指从文本中识别出具有特定意义的实体,如人名、地名、组织名等。可以使用自然语言处理技术进行实体识别。

import jieba.posseg as pseg

text = "Python 是一种广泛使用的高级编程语言。"
words = pseg.cut(text)
for word, flag in words:
    if flag == 'n':  # 名词
        print(word)

2、关系抽取

关系抽取是指从文本中识别出实体之间的关系。可以使用规则匹配或机器学习方法进行关系抽取。

# 示例:简单的规则匹配
text = "Python 是由 Guido van Rossum 创造的。"
if '创造' in text:
    print('Guido van Rossum 创造了 Python')

3、图数据库存储

将识别出的实体和关系存储到图数据库中,如 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 爬虫技术,从百度百科中提取词条内容,并将其结构化存储。通过批量爬取多个词条的内容,可以构建一个知识图谱,为后续的数据分析和应用提供基础。在实际应用中,还可以结合自然语言处理技术,进一步挖掘文本中的实体和关系,丰富知识图谱的内容。

Python 爬虫实战:爬取百度百科词条内容(知识图谱数据提取与结构化存储)_第1张图片

你可能感兴趣的:(python爬虫实战,python,爬虫,百度)