跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 爬虫实战:解析并下载百度文库内容

介绍如何使用 Python 的 requests 库和正则表达式解析百度文库页面,提取文档标题、页码信息及文本内容,并将结果保存为 doc 文件。同时提供图片数据的提取与下载方法,包含请求头设置、参数解析及去重处理等关键步骤。代码涵盖环境准备、核心类设计、详细实现及运行说明,强调合法合规使用及反爬注意事项。

微码行者发布于 2025/2/6更新于 2026/5/3116 浏览
Python 爬虫实战:解析并下载百度文库内容

Python 爬虫实战:解析并下载百度文库内容

前言

本文介绍如何使用 Python 的 requests 库和正则表达式解析百度文库页面,提取文档标题、页码信息及文本内容,并将结果保存为 doc 文件。同时提供图片数据的提取与下载方法,包含请求头设置、参数解析及去重处理等关键步骤。

本教程旨在帮助开发者理解网页数据抓取的基本流程,包括 HTML 解析、API 接口调用以及文件存储操作。请注意,爬虫技术应仅用于合法合规的学习与研究目的,请勿侵犯版权或用于商业牟利。

环境准备

在开始之前,请确保您的开发环境中已安装 Python 3.x 版本,并通过 pip 安装了必要的依赖库:

pip install requests

代码中使用了标准库 os, re, json, urllib.request,无需额外安装。

核心类设计

我们定义了一个名为 BaiduWk 的类来封装所有爬虫逻辑。该类主要包含以下功能模块:

  1. 初始化:设置 Session 对象以维持会话状态,配置 User-Agent 模拟浏览器请求。
  2. HTML 获取:发送 GET 请求获取网页源代码。
  3. 数据解析:使用正则表达式从源码中提取标题、文档 ID、页码范围等关键参数。
  4. 文本提取:通过分页请求获取文档 XML 结构中的文本内容。
  5. 图片下载:解析图片 API 接口,逐页下载文档中的图片资源。
  6. 文件保存:将提取的文本保存为 .doc 文件,图片保存为 .jpg 格式。
  7. 去重处理:对保存的文件进行简单的行级去重。

详细代码实现

以下是完整的 Python 脚本代码,包含了上述所有功能的实现细节。

import os
import re
import json
import requests
from urllib.request import urlretrieve


class BaiduWk:
    def __init__(self):
        self.list_info = []
        self.session = requests.session()
        # 设置 User-Agent 模拟移动端浏览器,降低被反爬识别的风险
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 '
            '(KHTML, like Gecko) Chrome/80.0.3987.87 Mobile Safari/537.36'
        }

    # 获取网页源代码的数据
    def get_html(self, start_url):
        try:
            response = self.session.get(start_url, headers=self.headers)
            response.encoding = response.apparent_encoding
            return response.text
        except Exception as e:
            print(f"获取页面失败:{e}")
            return None

    # 获取文档标题,提取请求参数
    def parse_html(self, data):     
        # 尝试从 JSON 片段中提取标题
        re_title = re.findall("'title': '(.*?)',", data)
        title = re_title[0] if re_title else re.findall('<title>(.*?)</title>', data)[0]
        
        # 提取关键请求参数,这些参数通常用于后续的分页请求
        params = {
            'bucketNum': re.findall(r'"bucketNum":(\d+)', data)[0],
            'md5sum': re.findall('md5sum=(.*?)&', data)[0],
            'sign': re.findall('sign=(.*?)&', data)[0],
            'rtcs_flag': re.findall('rtcs_flag=(.*?)&', data)[0],
            'rtcs_ver': re.findall('rtcs_ver=(.*?)&', data)[0],
            'rsign': re.findall('"rsign":"(.*?)"', data)[0], }
        
        # 提取页码列表,用于后续遍历每一页的内容
        page_range = re.findall(r'{"page":\d+,"range":"(.*?)"}', data)
        return params, page_range, title
	
    # 以页码列表依次迭代获取文本数据
    def words_data(self, params, page_range):
        pages = len(page_range) + 1
        url = r'https://wkrtcs.bdimg.com/rtcs/webapp'
        for i in range(1, pages):
            print(f'正在解析第{i}页数据,飞速读取中...')
            # 添加所需的页码信息
            params['pn'] = i
            params['range'] = page_range[i - 1]
            response = self.session.get(url, params=params).text
            yield response

    # 解析文章数据,提取 XML 结构中的文本
    def get_words(self, response):
        pages = 1
        for data in response:
            # 转化为 json 数据,去除首尾字符
            a = data[5:-1]
            text = ''
            d = json.loads(a)
            # 提取 c 键 的文本数据,递归遍历嵌套结构
            for j in d['document.xml']:
                for c in j['c']:
                    text += '\n'
                    for c2 in c['c']:
                        try:
                            text += c2['c'] + '\n'
                        except:
                            continue
            text += f'\n------------------------当前第{pages}页-------------------------\n'
            pages += 1
            self.list_info.append(text)

    # 保存文件到本地
    def save_info(self, title, path):   
        os.makedirs('百度文库', exist_ok=True)
        with open(path, 'w', encoding='utf-8') as f:
            f.writelines(self.list_info)

    def get_img(self, start_url):
        print('开始尝试解析百度文库图片...\n')
        r = self.session.get(start_url)
        r.encoding = r.apparent_encoding
        title = re.findall("'title': '(.*?)'", r.text)[0]
        print(title)
        docId = re.findall("'docId': '(.*?)'", r.text)[0]
        totalPageNum = re.findall("'totalPageNum': '(.*?)'", r.text)[0]
        totalPageNum = int(totalPageNum) + 1

        return totalPageNum, title, docId

    def download_img(self, totalPageNum, title, docId):
        for pn in range(1, totalPageNum):
            params = {'doc_id': docId, 'pn': pn, 'rn': 1, 'type': 'ppt', }
            api_url = 'https://wenku.baidu.com/browse/getrequest'
            r = self.session.get(api_url, params=params, headers=self.headers)
            src = r.json()[0].get('zoom')
            os.makedirs(title, exist_ok=True)
            path = title + '/' + str(pn) + '.jpg'
            urlretrieve(src, path)
            print(f'正在提取第{pn}页,请稍等...')
    
    # 文章去重处理
    def set_word(self, path):
        word_set = list()
        with open(path, 'r', encoding='utf-8') as f:
            for each_line in f:
                word_set.append(each_line)
        result = list(set(word_set))
        result.sort(key=word_set.index)
        with open(path, 'w', encoding='utf-8') as f:
            f.writelines(result)
            print('done')

	# 获取文字内容的主入口
    def run_word(self):
        print('开始尝试解析百度文库页面...\n')
        start_url = input('输入百度文库中的连接:')
        print('running...\n')
        # 修正 URL 格式,将 wenku 替换为 wk
        start_url = re.sub('wenku', 'wk', start_url)
        html = self.get_html(start_url)
        if not html:
            print("无法获取页面内容")
            return
        param, ranges, title = self.parse_html(html)
        print(f'当前文章:{title}\n')
        path = '百度文库/' + title + '.doc'
        response = self.words_data(param, ranges)
        self.get_words(response)
        self.save_info(title, path)
        self.set_word(path)
        print('done!!!')
        print('程序执行完毕!')

	# 获取图片数据的主入口
    def run_img(self):
        print('开始尝试解析百度文库图片信息...\n')
        start_url = input('输入百度文库中的连接:')
        print('running...\n')
        totalPageNum, title, docId = self.get_img(start_url)
        self.download_img(totalPageNum, title, docId)
        print('done!!!')
        print('程序执行完毕!')


if __name__ == '__main__':
    wk = BaiduWk()
    # 默认运行文字提取,如需图片可取消注释下方代码
    wk.run_word()
    # wk.run_img()

使用说明

  1. 运行脚本:将上述代码保存为 baidu_wk.py,在终端运行 python baidu_wk.py。
  2. 输入链接:根据提示粘贴百度文库文章的 URL 地址。
  3. 等待完成:程序会自动解析并下载内容,进度会在控制台显示。
  4. 查看结果:下载完成后,在本地目录 百度文库 下查找生成的 .doc 文件和图片文件夹。

注意事项与法律风险

  1. 版权保护:百度文库中的内容大多受版权保护。本代码仅供技术交流和学习使用,严禁用于商业用途或传播侵权内容。
  2. 反爬机制:目标网站可能会更新接口或增加验证机制(如验证码、IP 限制),导致脚本失效。请保持关注相关技术动态。
  3. 频率控制:建议在循环请求中加入延时(time.sleep),避免对服务器造成过大压力。
  4. 数据准确性:由于网页结构可能变动,正则匹配部分可能需要根据实际情况调整。

总结

通过本教程,我们掌握了利用 Python 进行网页数据抓取的基本流程。重点在于分析网络请求参数、解析返回数据结构以及处理文件 IO。希望读者能在此基础上扩展更多功能,例如支持更多文档类型或自动登录验证。

目录

  1. Python 爬虫实战:解析并下载百度文库内容
  2. 前言
  3. 环境准备
  4. 核心类设计
  5. 详细代码实现
  6. 获取文字内容的主入口
  7. 获取图片数据的主入口
  8. 使用说明
  9. 注意事项与法律风险
  10. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 增强现实(AR)技术全解析:从概念到应用
  • Vue 3 实战:10 个提升开发效率的常用技巧
  • Pixel Shuffle 与 Unshuffle 原理及算法流程
  • KaiwuDB 3.1.0 在 Ubuntu 22.04 部署实战:TLS 配置与性能基线
  • 软件开发并非易事:低代码与零基础的真相
  • Qwen-Image-Edit-2511:AI 图像编辑的几何推理升级实战
  • JetBrains Copilot Agent Mode + MCP 配置实战
  • 网络安全技术入门:渗透测试、二进制逆向与安全研发
  • 人工智能应用工程师(高级)课程体系与技术路径解析
  • Java Web 蛋糕商城系统设计与实现
  • STM32H743 与 STM32F407 串口通信配置与优化实践
  • OpenClaw 本地 AI 助手部署与飞书对接指南
  • MIT 电机模式控制详解:参数配置与调试实战
  • Python 连接 MySQL 的 5 种主流方案
  • RPA 机器人流程自动化技术解析与应用
  • 数据结构:带头双向循环链表详解与实现
  • 开源 RemoteID 方案:无人机身份识别与合规部署指南
  • ACM 模式输入输出处理与数据结构构建模板
  • 大语言模型(LLM)基础概念、类型与应用场景详解
  • AG-UI:构建 AI 前端交互的统一协议

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online