如何使用python技术爬取下载百度文库文档?
使用 Python 爬取百度文库文档需要通过分析网页结构和接口请求来实现。以下是一个基于搜索结果的实现方法,适用于爬取百度文库中的文档内容:
第一部分:获取百度文库文档
实现步骤
- 获取文档 ID 和基本信息
通过文档的 URL 获取文档 ID,并解析页面内容以获取文档的类型、标题等信息。 - 请求文档信息接口
使用getdocinfo接口获取文档的页数、MD5 校验码等参数。 - 请求文档正文内容
根据文档类型(如 txt、doc 等),请求对应的接口获取正文内容。 - 保存文档内容
将获取到的内容保存为本地文件。
示例代码
以下是一个简单的 Python 示例代码,用于爬取百度文库中的 .txt 类型文档:
Python复制
import re
import json
import requests# 初始化会话
session = requests.Session()def get_doc_info(url):# 获取文档 ID 和页面内容doc_id = re.findall('view/(.*?).html', url)[0]response = session.get(url)content = response.content.decode('gbk')# 获取文档类型和标题doc_type = re.findall(r"'docType.*?\':.*?\'(.*?)\',", content)[0]title = re.findall(r"'title.*?\':.*?\'(.*?)\',", content)[0]return doc_id, doc_type, titledef get_doc_content(doc_id, doc_type):# 请求文档信息接口content_url = f'https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id={doc_id}'response = session.get(content_url)content = response.content.decode('gbk')# 提取必要的参数md5sum = re.findall('"md5sum":"(.*?)"', content)[0]pn = re.findall('"totalPageNum":"(.*?)"', content)[0]rsign = re.findall('"rsign":"(.*?)"', content)[0]# 请求文档正文内容text_url = f'https://wkretype.bdimg.com/retype/text/{doc_id}?rn={pn}&type={doc_type}&md5sum={md5sum}&rsign={rsign}'response = session.get(text_url)content = json.loads(response.content.decode('utf-8'))# 提取正文内容result = ''for item in content:for para in item['parags']:result += para['c'].replace('\\r', '\r').replace('\\n', '\n')return resultdef save_file(title, content):filename = f'{title}.txt'with open(filename, 'w', encoding='utf-8') as f:f.write(content)print(f"文件 {title} 保存成功")# 主函数
def main():url = input("请输入百度文库文档的 URL 地址:")doc_id, doc_type, title = get_doc_info(url)content = get_doc_content(doc_id, doc_type)save_file(title, content)if __name__ == "__main__":main()
注意事项
- 反爬机制:百度文库有反爬机制,频繁请求可能会导致 IP 被封禁。建议适当增加延时或使用代理。
- 文档类型:不同类型的文档(如
.doc、.ppt、.xls)可能需要不同的处理方式。例如,.ppt和.xls可能需要额外的接口或解析逻辑。 - 合法性:爬取百度文库内容可能涉及版权问题,请确保仅用于学习和研究目的,避免侵犯版权。
通过上述代码和方法,你可以实现对百度文库文档的爬取和下载。如果需要处理其他类型的文档,可以参考搜索结果中的相关代码逻辑。
百度文库官网

第二部分:避免爬虫被封禁的实现方法
为了避免在爬取百度文库文档时被封禁,可以通过以下几种方法设置延时和优化爬虫策略:
1. 使用固定延时
在每次请求之间加入固定的时间间隔,可以有效降低请求频率,减少被封禁的风险。例如,设置每次请求间隔为2秒:
Python复制
import time
time.sleep(2) # 暂停2秒
这种方法简单直接,但可能不够灵活。
2. 使用随机延时
随机延时可以更接近真实用户的访问行为,降低被识别为爬虫的风险。可以使用 random.uniform() 生成随机延时:
Python复制
import time
import randomdelay = random.uniform(1, 3) # 随机延时1到3秒
time.sleep(delay)
随机延时可以有效模拟人类行为,减少被封禁的可能性。
3. 使用爬虫框架的延迟设置
如果你使用的是爬虫框架(如 Scrapy),可以在框架的设置中指定延迟。例如,在 Scrapy 的 settings.py 中设置 DOWNLOAD_DELAY:
Python复制
class MySpider(Spider):name = 'my_spider'start_urls = ['http://example.com']custom_settings = {'DOWNLOAD_DELAY': 3, # 设置下载延迟为3秒'CONCURRENT_REQUESTS': 1 # 设置并发请求数为1}
这种方式适合需要频繁请求的场景。
4. 使用代理IP
使用代理IP可以隐藏真实IP地址,降低因IP被封禁的风险。可以使用代理池轮换IP:
Python复制
proxies = {'http': 'http://your_proxy_ip:port','https': 'http://your_proxy_ip:port',
}
response = requests.get('http://example.com', proxies=proxies)
代理IP可以有效避免因请求频率过高而导致的IP封禁。
5. 模拟浏览器行为
通过设置请求头(如 User-Agent),可以伪装成浏览器访问,降低被识别为爬虫的风险:
Python复制
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'
}
response = requests.get(url, headers=headers)
这种方式可以进一步减少被封禁的可能性。
6. 动态调整延时
在遇到请求失败或被封禁时,可以动态调整延时策略,例如递增延时:
Python复制
def linear_delay(initial_delay=1, factor=2, max_delay=60):delay = initial_delaywhile delay < max_delay:time.sleep(delay)delay *= factor
这种方法可以在遇到问题时逐步降低请求频率。
总结
通过合理设置延时、使用代理IP、模拟浏览器行为等方法,可以有效降低爬虫被封禁的风险。在实际应用中,可以根据目标网站的反爬机制灵活调整策略。
相关文章:
如何使用python技术爬取下载百度文库文档?
使用 Python 爬取百度文库文档需要通过分析网页结构和接口请求来实现。以下是一个基于搜索结果的实现方法,适用于爬取百度文库中的文档内容: 第一部分:获取百度文库文档 实现步骤 获取文档 ID 和基本信息 通过文档的 URL 获取文档 ID&…...
navicat无法连接虚拟机的docker中的mysql
我的数据库安装在了虚拟机的docker中,启动MySQL后,在主机上使用navicat一直连接不上。 首先确认密码是否有问题: docker exec -it mysql8 bash #进入mysql容器 mysql -u root -p #登录MySQL,我这边密码是123456 密码没问题的话…...
如何使用CRM数据分析优化销售和客户关系?
嘿,大家好!你有没有想过为什么有些公司在市场上如鱼得水,而另一些却在苦苦挣扎?答案可能就藏在他们的销售策略和客户关系管理(CRM)系统里。今天我们要聊的就是如何通过有效的 CRM 数据分析来提升你的销售额…...
【Unity3D】3D物体摆放、场景优化案例Demo
目录 PlaceManager.cs(放置管理类) Ground.cs(地板类) 和 GroundData.cs(地板数据类) 额外知识点说明 1、MeshFilter和MeshRenderer的Bounds区别 2、Gizmos 绘制一个平行于斜面的立方体 通过网盘分享的文件:PlaceGameDemo2.unitypackage 链接: https://pan.baid…...
使用HTML5 Canvas 实现呼吸粒子球动画效果的原理
在网页开发领域,动画效果能够极大地提升用户体验,让页面变得更加生动有趣。今天,我们深入剖析一个基于 HTML5 Canvas 的 3D 粒子动画 —— 呼吸粒子球。通过详细解读其代码实现,我们将全面了解如何运用 HTML5 的强大功能构建出如此…...
Java 中实体类与操作类分离
目录 一、为啥要把实体类和操作类分开 二、实体类长啥样,怎么用 三、操作类的使命与实现 四、实战演练:实体类与操作类协同工作 五、拓展思考:这种分离带来的好处与进一步优化 六、总结与展望 家人们,今天我想跟你们唠唠我在…...
【STM32HAL-----GPIO】
1. 什么是GPIO?(了解) 2. STM32 GPIO简介 2.1. GPIO特点 2.2. GPIO电气特性 2.3. GPIO引脚分布图 IO引脚分布特点:按组存在、组数视芯片而定、每组最多16个IO引脚。 3. IO端口基本结构介绍 4. GPIO八种工作模式 4.1. 输入浮空 特…...
Java Web开发高级——单元测试与集成测试
测试是软件开发的重要环节,确保代码质量和功能的正确性。在Spring Boot项目中,单元测试和集成测试是常用的两种测试类型: 单元测试:测试单个模块(如类或方法)是否按预期工作。集成测试:测试多个…...
编译chromium笔记
编译环境: windows10 powershell7.2.24 git 2.47.1 https://storage.googleapis.com/chrome-infra/depot_tools.zip 配置git git config --global user.name "John Doe" git config --global user.email "jdoegmail.com" git config --global …...
Web开发 -前端部分-CSS3新特性
1 CSS概述 2 CSS3私有前缀 3 CSS3的长度单位 代码实现: <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...
【基础篇】什么是SQL注入,如何防止?
什么是 SQL 注入,如何防止? SQL 注入(SQL Injection)是一种常见的网络安全漏洞,它发生在 Web 应用程序中,当恶意用户在输入数据时,将恶意的 SQL 代码插入到输入中,从而导致应用程序…...
Swift语言的数据结构
Swift语言的数据结构 Swift是一种现代化的编程语言,它以安全性、性能和简洁性著称。尽管Swift通常被视为面向对象的语言,但它也支持函数式编程的特性,使得开发者可以以多种方式构建应用程序。在Swift中,数据结构是编程的基础&…...
牛客周赛 Round 77
题目链接:牛客周赛 Round 77 A. 时间表 tag:签到 B. 数独数组 tag:签到 Description:给定n个数,每个数的范围为1-9,问能否经过排列,使其每个长度为9的连续子数组都包含1-9这9个数字。 Sol…...
浅谈云端编辑器,分析其亮点与不足
浅谈云端编辑器,分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析: 1. 左侧题目筛选栏 层次结构清晰:左侧栏展示了一个层级结构,题目按主题分…...
web应用引入cookie机制的用途和cookie技术主要包括的内容
web应用引入cookie机制,用于用户跟踪。 (1)HTTP响应报文中的Cookie头行:set-Cookie (2)用户浏览器在本地存储、维护和管理的Cookie文件 (3)HTTP请求报文中的Cookie头行:…...
【HTML+CSS】使用HTML与后端技术连接数据库
目录 一、概述 1.1 HTML前端 1.2 后端技术 1.3 数据库 二、HTML表单示例 三、PHP后端示例 3.1 连接数据库 3.2 接收数据并插入数据库 四、安全性 4.1 防止SQL注入 4.2 数据验证与清洗 五、优化 5.1 索引优化 5.2 查询优化 六、现代Web开发中的最佳实践 6.1 使用…...
「2024·我的成长之路」:年终反思与展望
文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日,2024年博客之星入围公布,很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年,是意义非凡的一年,是充…...
C#PaddleOCRSharp使用
using PaddleOCRSharp;namespace PaddleOCRSharpDemo {internal class Program{static void Main(string[] args){//中英文模型V3模型OCRModelConfig config null;//OCR参数OCRParameter oCRParameter new OCRParameter();oCRParameter.cpu_math_library_num_threads 6;//预…...
【Excel】【VBA】Reaction超限点筛选与散点图可视化
【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能: 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…...
京华春梦,守岁这方烟火人间
文章目录 准备篇温度公共交通人流情况年货采购 文化体验传统庙会博物馆与展览烟花灯会祈福仪式民俗集市现代氛围其他活动 美食盛宴传统美食与特色小吃传统老字号京城新宠特色小吃街多元美食街 准备篇 温度 北京春节期间气温较低,室外通常在零下几度到零上几度之间…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
若依项目部署--传统架构--未完待续
若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…...
