如何使用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-…...
京华春梦,守岁这方烟火人间
文章目录 准备篇温度公共交通人流情况年货采购 文化体验传统庙会博物馆与展览烟花灯会祈福仪式民俗集市现代氛围其他活动 美食盛宴传统美食与特色小吃传统老字号京城新宠特色小吃街多元美食街 准备篇 温度 北京春节期间气温较低,室外通常在零下几度到零上几度之间…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...