用过百度文库的小伙伴大部分都会有这种烦恼,不知如何描述,上这张图你大概就明白了
起初的解决方案是按F12然后选择元素、复制。即使这样也只能一句话一句话的复制内容,后来随着照相取字app的出现这一问题似乎出现转机,但基于app的操作、广告、识别精度等问题让我感觉玩不来玩不来。学了爬虫之后一直想做个只需要文章链接就能爬取整篇文章的爬虫程序,后来。。。我做出来了(本来想写自己如何如何努力,然后取得成功,不过想想自己的语文功底还是算了)
爬虫的成功少不了这位大佬的视频:https://www.bilibili.com/video/av62819906?from=search&seid=13649877673142418178
另外在GitHub找到一份代码应该是这位大佬写的:https://github.com/Jack-Cherish/python-spider/commit/3c5480d4a187265c0884f5e20019e854150ed306
由于是18年的教程,随着百度文库的更新现在爬取规则已经发生变化,在弄明白整个爬虫程序的开发流程后我决定重新写一个适用现在文库规则的爬虫。这篇文章主要讲百度文库的爬取思路,如果需要源码请移步:https://blog.csdn.net/qq_26024785/article/details/105075077
第一步:明确文章展示方式
经过大量的随机浏览文章,我发现百度文库的文章阅读页有两种版式,我们称之为新版和旧版,神奇的事情是同一篇文章的版式是随机的,即你在不同的时间访问同一篇文章,文章阅读页可能是新版也可能是旧版,在这里讨论新版和旧版是因为爬取规则不同,文章内容不受影响。
旧版:
这个版本的文章大佬的程序应该还是可以正常爬取的。
新版:
同时,新版和旧版中又分doc、txt、ppt等多个文章格式,而平时在百度文库复制文章时大概率是doc和txt格式,所以在写程序的第一个版本时先满足自己最基本的需求即可。
在弄明白百度文章的两个版本之后再确定文章内容的加载方式,最初认为文章内容的前几页在网页源码中,剩下几页的内容通过点击阅读全文后ajax请求再添加到网页源码中,后来发现文章所有页都是通过js代码后期请求再加载的(这样做理论上可以提升网页加载速度)。
第二步:找出文章内容请求链接
这一步算是整个程序最难的地方,也是爬虫程序开发中网页分析的核心。上面说到每一页的内容都是通过js代码后期请求的,那么网页源码中一定有请求的链接,不过源码中链接都是含有转义字符的无法在大量的源码中一眼识别出来。下面讲一下新版doc和txt文档的请求链接是如何找到的
新版doc文档
首先找到一篇doc格式文章,按F12进入开发者工具,点击network–>clear–>刷新网页。这时发现有几个文件名以0.json开头的文件数量与文章页数一直,选中后点击Preview发现body中就是文章内容
这个时候点击Headers查看Request URL
有些小伙伴可能有点懵找这个url干啥?前面说了文章的所有内容都是网页源码加载完成后再请求–>服务器返回数据–>将内容添加到网页代码中,而向服务器请求的url就是这个,所以说找到这个url之后就可以通过几个关键字去网页源码中搜所有的请求url(不同页内容的request url大同小异),比如搜索关键字wkbjcloudbos.bdimg.com
搜索结果只有6个,正对应文章有6页内容,有了这个就可以在程序中通过正则表达式提取所有的链接,然后我反手给他们request一下,将接收到的数据进行解析提取有效内容。
新版txt文档
找到一篇txt格式的文章,按F12进入开发者工具,点击network–>clear–>刷新网页。可以找到一个名字以文章ID开头的文件,而这个文件中的数据就是文章内容,而且包含所有页的内容。
找到这个文件的请求链接
将Request URL单独拿出来分析:
分析URL后我们可以知道只要在文章URL和源码中获取所需要的几个数据(id、md5sum、sign、rn、rsign)然后拼接成一个URL字符串进行访问,服务器便会response包含文章内容的文件。
这是新版txt文档的爬取过程,所需要的几个数据都可以在网页源码中获取到,而旧版的txt网页源代码中不能直接获取这几个数据,通过文章ID拼接处URL(https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=’ + ID),访问该URL,在response中提取需要的md5sum等数据,剩下的操作同上。这个版本还没有实现对旧版txt文档的爬取,以后有时间会补上。
其他格式(PPT、PDF、XLS)的文档爬取方式大同小异,在这里就不做赘述。
GUI设计
由于这篇文章主要讲百度文库的爬取思路,所以GUI设计这块一笔带过,用到的库是Tkinter,效果演示:
后续有机会的话将会将此项目移植到我的个人博客网站中,以后只需要到我的网站上就能爬取文章。
做这个小工具的初心是为了提高写报告、论文的质量与速度,爬取思路及源代码仅供学习参考,如果需要下载整篇文章请支持正版。