教你用 Python 爬取 Baidu 文库全格式文档

本文介绍了如何使用Python爬取Baidu文库的TXT、DOCX、PPT和PDF文档。通过分析网页加载机制,伪装User-Agent绕过Robot协议,利用BeautifulSoup解析网页,python-docx保存DOCX文件。对于异步加载的PPT和PDF,采用Selenium自动化测试工具,结合ChromeDriver模拟用户交互,逐页抓取内容并保存为图片,最后将图片合并为PDF。此外,还提及了制作GUI的可能性,用C#调用Python爬虫代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑到现在大部分小伙伴使用 Python 主要因为爬虫,那么为了更好地帮助大家巩固爬虫知识,加深对爬虫的理解,选择了爬取百度文库作为我们的目标。

教你用 Python 爬取 Baidu 文库全格式文档

 

废话不多说,我们开始。

TXT、DOCX 爬取与保存

教你用 Python 爬取 Baidu 文库全格式文档

 

在爬取任何东西之前,我们都要先确认需要爬取的数据是不是异步加载的;如果是异步加载的直接爬取网页是爬不到的。

要知道是不是异步加载其实很简单,就用requests 对网页发起请求,看看 response 是什么就可以了

url = 'https://wenku.baidu.com/view/4e29e5a730126edb6f1aff00bed5b9f3f90f72e7.html?rec_flag=default'
header = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
res = requests.get(url , headers = header)
res.text

教你用 Python 爬取 Baidu 文库全格式文档

 

很明显,返回的东西,并不是我们所需要的内容; 根据常理来说,我们就可以认为该网页是异步加载的。

但是,从常识来讲,如果网页的内容是异步加载的,那么直接通过百度搜索,是搜索不到网页内部的内容的,但是很显然,我们每次通过百度搜索都是可以直接找到文库中的文本内容的。

如下:

教你用 Python 爬取 Baidu 文库全格式文档

 

那么这就有意思了,明明直接发起请求是获取不到网页内容的,但是为什么通过百度搜索就可以找到呢? 关键肯定在于百度搜索 上面。

这个时候通过查阅资料,我们了解到,最主要的问题出在我们的 headers

在爬取网页时,headers 通常是作为身份证,让网页不看出我们是爬虫;如果不加 headers,网页直接就会看出我们是爬虫,就会拒绝访问

 

 

再深入了解一下 headers 的识别机理,我们发现了叫做 Robot 协议的东西。

它规定了什么样的 headers 可以访问网页内部内容,除了指定 headers 之外的 headers,都是无法请求页面内容的。

比如说百度文库的 Robot 协议就是下面这样的:

User-agent: Baiduspider

Disallow: /w?

Disallow: /search?

Disallow: /submit

Disallow: /upload

Disallow: /cashier/   

而我们需要爬取的内容 url 格式为

https://wenku.baidu.com/view/?.html

这代表 Baiduspider 应该可以爬取文库内容;大致猜测这是因为百度搜索时需要根据文本内容匹配搜索选项,所以放行。

因此我们尝试伪装 UA 为 Baiduspider

url = 'https://wenku.baidu.com/view/4e29e5a730126edb6f1aff00bed5b9f3f90f72e7.html?rec_flag=default'
header = {'User-agent': 'Googlebot'}
res = requests.get(url , headers = header)
res.text

果然不出所料,我们成功地获取到了目标内容

由于百度文库使用了反爬虫技术,直接访问页面无法获取到文档内容。因此,我们需要使用一些技巧来爬取百度文库。 一种比较通用的方法是使用Selenium模拟浏览器操作,然后获取页面内容。下面是一个使用Selenium和Chrome浏览器的例子: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://wenku.baidu.com/view/xxxxx.html" # 文档的URL driver = webdriver.Chrome() # 创建一个Chrome浏览器实例 driver.get(url) # 打开网页 # 等待文档加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reader-txt-layer"))) # 获取文档内容 content = driver.find_element_by_css_selector(".reader-txt-layer").text print(content) # 输出文档内容 driver.quit() # 关闭浏览器 ``` 需要注意的是,由于百度文库的反爬虫技术会检测浏览器的User-Agent,因此我们需要设置Chrome浏览器的User-Agent为某个常见的浏览器,比如Chrome或Firefox: ```python options = webdriver.ChromeOptions() options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3") driver = webdriver.Chrome(options=options) ``` 另外,如果我们需要爬取多个文档,可以使用一个循环遍历不同的URL来实现: ```python urls = ["https://wenku.baidu.com/view/xxxxx.html", "https://wenku.baidu.com/view/yyyyy.html", ...] for url in urls: driver.get(url) # 等待文档加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reader-txt-layer"))) # 获取文档内容 content = driver.find_element_by_css_selector(".reader-txt-layer").text print(content) # 输出文档内容 driver.quit() ``` 需要注意的是,百度文库每个文档只能免费查看一定数量的页数,超过限制后需要付费才能继续查看。因此,如果你需要爬取整个文档,可能需要多次爬取不同的页面,并将结果拼接起来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值