Python爬虫实战:高效爬取百度百科数据并解析(附完整代码)

一、项目背景与价值

百度百科作为全球最大的中文百科全书,包含超过2400万个词条。通过Python爬虫可以:

  1. 构建垂直领域知识图谱

  2. 进行自然语言处理训练

  3. 制作智能问答系统

  4. 分析热点事件演变

二、技术方案设计

2.1 技术栈选择

  • Requests:高效HTTP请求库(比urllib更简洁)

  • BeautifulSoup4:HTML解析利器

  • lxml:高性能解析器(速度比html.parser快30%)

  • Fake-Useragent:动态生成请求头

2.2 反爬策略应对

百度百科的反爬机制包括:

  1. User-Agent验证

  2. 高频访问限制

  3. 行为特征检测

  4. 验证码系统(高频触发时)

三、实战代码实现

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)

四、代码优化技巧

  1. 动态代理IP:使用付费代理服务轮换IP

  2. Selenium备用方案:应对动态渲染页面

  3. 增量爬取:记录已爬取URL避免重复

  4. 异常重试机制:添加retry装饰器

proxies = {
    'http': 'http://user:pass@ip:port',
    'https': 'https://user:pass@ip:port'
}

    五、法律与道德规范

    1. 严格遵守robots.txt协议

    2. 控制请求频率(建议≤3次/秒)

    3. 禁止商业化使用爬取数据

    4. 设置明显的User-Agent标识

    六、扩展应用方向

    1. 结合TF-IDF提取关键词

    2. 构建知识图谱(Neo4j实现)

    3. 自动摘要生成(TextRank算法)

    4. 词条关系网络分析

    七、常见问题排查

    Q:返回403错误怎么办?
    A:1)更新User-Agent 2)增加访问间隔 3)检查IP是否被封禁

    Q:解析不到数据?
    A:1)检查CSS选择器是否更新 2)查看页面是否跳转验证码 3)确认网络环境正常

    注意事项:本文代码仅供学习交流,请勿用于商业用途或高频访问目标网站。实际开发中建议使用百度官方API。持续关注优快云技术社区获取更多爬虫进阶技巧!

    👉 你的三连是作者更新的最大动力! 

    评论 2
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值