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

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

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

文章插图
 
废话不多说 , 我们开始 。TXT、DOCX 爬取与保存
在爬取任何东西之前 , 我们都要先确认需要爬取的数据是不是异步加载的;如果是异步加载的直接爬取网页是爬不到的 。
要知道是不是异步加载其实很简单 , 就用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 , 网页直接就会看出我们是爬虫 , 就会拒绝访问
教你用 Python 爬取 Baidu 文库全格式文档

文章插图
 
再深入了解一下 headers 的识别机理 , 我们发现了叫做 Robot 协议的东西 。
它规定了什么样的 headers 可以访问网页内部内容 , 除了指定 headers 之外的 headers , 都是无法请求页面内容的 。
比如说百度文库的 Robot 协议就是下面这样的:
User-agent: BaiduspiderDisallow: /w?Disallow: /search?Disallow: /submitDisallow: /uploadDisallow: /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果然不出所料 , 我们成功地获取到了目标内容
教你用 Python 爬取 Baidu 文库全格式文档

文章插图
 
既然已经成功获取到了网页的正确源代码 , 那么下一步就是去解析网页获取内容 。
解析网页源代码的库有很多 , 这里我们使用 BeautifulSoup
plist = []soup = BeautifulSoup(r, "html.parser")plist.append(soup.title.string)for div in soup.find_all('div', attrs={"class": "bd doc-reader"}):plist.extend(div.get_text().split('n'))plist = [c.replace(' ', '') for c in plist]plist = [c.replace('\x0c', '') for c in plist]plist整个解析是非常容易的 , 都是很标准的操作 。
在这里就不多加叙述了 , 最终的效果如下:
教你用 Python 爬取 Baidu 文库全格式文档

文章插图
 
当然爬取到东西了只是万里长征的第一步 , 就这样是肯定不行的 , 我们还需要将爬取的内容保存起来 , 通常是保存为 txt 文件
file = open('test.txt', 'w',encoding='utf-8')for str in plist:file.write(str)file.write('n')file.close()
教你用 Python 爬取 Baidu 文库全格式文档

文章插图
 
但是为了美观起见 , 我们在这里选择使用 python-docx 库将内容保存为 docx 文件


推荐阅读