一、项目背景与价值
百度百科作为全球最大的中文百科全书,包含超过2400万个词条。通过Python爬虫可以:
-
构建垂直领域知识图谱
-
进行自然语言处理训练
-
制作智能问答系统
-
分析热点事件演变
二、技术方案设计
2.1 技术栈选择
-
Requests:高效HTTP请求库(比urllib更简洁)
-
BeautifulSoup4:HTML解析利器
-
lxml:高性能解析器(速度比html.parser快30%)
-
Fake-Useragent:动态生成请求头
2.2 反爬策略应对
百度百科的反爬机制包括:
-
User-Agent验证
-
高频访问限制
-
行为特征检测
-
验证码系统(高频触发时)
三、实战代码实现
3.1 环境准备
pip install requests beautifulsoup4 fake-useragent
3.2 核心代码实现
from bs4 import BeautifulSoup
import requests
from fake_useragent import UserAgent
import time
import json
class BaiduBaikeSpider:
def __init__(self):
self.ua = UserAgent()
self.base_url = "https://baike.baidu.com/item/{}"
self.headers = {
'User-Agent': self.ua.random,
'Referer': 'https://baike.baidu.com/'
}
self.timeout = 5
self.delay = 1 # 访问间隔
def get_html(self, keyword):
"""获取加密后的百科页面"""
try:
url = self.base_url.format(requests.utils.quote(keyword))
response = requests.get(url, headers=self.headers, timeout=self.timeout)
response.encoding = 'utf-8'
if response.status_code == 200:
return response.text
return None
except Exception as e:
print(f"请求异常:{str(e)}")
return None
def parse_content(self, html):
"""解析结构化数据"""
soup = BeautifulSoup(html, 'lxml')
result = {}
# 提取核心信息
try:
result['title'] = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').h1.text.strip()
except:
result['title'] = None
# 提取摘要
try:
summary = soup.find('div', class_='lemma-summary')
result['summary'] = summary.text.strip().replace('\n', '')
except:
result['summary'] = None
# 提取基本信息栏
info_box = {}
try:
basic_info = soup.find('div', class_='basic-info cmn-clearfix')
dt_list = basic_info.find_all('dt', class_='basicInfo-item name')
dd_list = basic_info.find_all('dd', class_='basicInfo-item value')
for dt, dd in zip(dt_list, dd_list):
key = dt.text.strip().replace('\xa0', '')
value = dd.text.strip().replace('\n', '')
info_box[key] = value
except:
pass
result['basic_info'] = info_box
return result
def save_data(self, data, filename='baike_data.json'):
"""数据存储方法"""
with open(filename, 'a', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
f.write('\n')
def run(self, keyword):
time.sleep(self.delay) # 访问延迟
html = self.get_html(keyword)
if html:
data = self.parse_content(html)
if data['title']:
self.save_data(data)
print(f"成功爬取:{data['title']}")
return data
return None
if __name__ == '__main__':
spider = BaiduBaikeSpider()
keywords = ['Python', '人工智能', '机器学习']
for kw in keywords:
spider.run(kw)
四、代码优化技巧
-
动态代理IP:使用付费代理服务轮换IP
-
Selenium备用方案:应对动态渲染页面
-
增量爬取:记录已爬取URL避免重复
-
异常重试机制:添加retry装饰器
proxies = {
'http': 'http://user:pass@ip:port',
'https': 'https://user:pass@ip:port'
}
五、法律与道德规范
-
严格遵守
robots.txt
协议 -
控制请求频率(建议≤3次/秒)
-
禁止商业化使用爬取数据
-
设置明显的User-Agent标识
六、扩展应用方向
-
结合TF-IDF提取关键词
-
构建知识图谱(Neo4j实现)
-
自动摘要生成(TextRank算法)
-
词条关系网络分析
七、常见问题排查
Q:返回403错误怎么办?
A:1)更新User-Agent 2)增加访问间隔 3)检查IP是否被封禁
Q:解析不到数据?
A:1)检查CSS选择器是否更新 2)查看页面是否跳转验证码 3)确认网络环境正常
注意事项:本文代码仅供学习交流,请勿用于商业用途或高频访问目标网站。实际开发中建议使用百度官方API。持续关注优快云技术社区获取更多爬虫进阶技巧!
👉 你的三连是作者更新的最大动力!