首先先分享下github这篇文章吧,参考了部分代码,但我想做一个很详细的解读。

新版百度文库爬虫 · Jack-Cherish/python-spider@3c5480d​github.com

首先,我想自动化打开百度文库的页面(其实这一步,并不需要,经实践得知)。

不过,我觉得这一步算是初级的对selenium理解,希望对大家有所帮助。

第一步的流程:自动化打开百度文库网页 -> 将窗口下滑到“继续阅读”的按钮处 -> 自动点击 -> 显示完整页面。

def auto_page_search(url):print('开始自动查询网页')browser = webdriver.Chrome()# browser.get('https://wenku.baidu.com/view/dcfab8bff705cc175527096e.html')browser.get(url)print('等待5秒')time.sleep(5)# 下面这个语句并不是查找“继续阅读”按钮所在位置,而是更上面的元素,因为按照原本元素位置滑动窗口会遮挡住,大家可以试一试eles = browser.find_element_by_xpath('//*[@id="html-reader-go-more"]/div[1]/div[3]/div[1]')browser.execute_script('arguments[0].scrollIntoView();', eles)print('等待2秒')time.sleep(2)#点击“继续阅读”按钮browser.find_element_by_xpath('//*[@id="html-reader-go-more"]/div[2]/div[1]/span/span[2]').click()print('已显示文档所有内容')

接着,欸我们就想着定义一个可以抓取网页源代码的函数,以便于我们后面的爬取,这个函数很重要。

def fetch_url(url):''':return: 网页源代码'''headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}session = requests.session()sourse = session.get(url, headers=headers).content.decode('gbk')return sourse

这里用的是 session 方法,不过我认为直接 request.get 也 OK ,看个人喜好了。

doc ,txt ,pdf ppt 的爬取方式有些差异,而且都很奇怪。

先介绍 txt 格式的文库如何爬取:

我们打开一个文档,如下:

好吧我们现在话不多说,直接打开开发者工具。

大家不能被 Element 中显示有文档的内容,就想着直接用什么正则、xpath等暴力爬取源代码了,这里显示的内容,是经过一系列渲染以后,展示在我们面前的,右键打开网页源代码,会发现根本没有什么文字内容。

那我们看一下真正的文字内容在哪里?很难找,就在下面的加载文件里:

敢信?没错就是这么长一个文件,URL 中的红线(可能没标好)显示的部分,是需要我们获取的,比如 md5 ,rsign 等,然后构成这个 URL 。

可能有人问了,我们都能找到这个文件,为什么不直接用呢?偏要找到那些 md5 、rsign 。因为我们是希望直接输入百度文档的地址,就直接自动生成 txt 文件,而不是每一次费很大劲找到这个加载文件。当然如果不嫌麻烦的话你也可以这样做。

所以我们应该找到 network 中第一个文件,它里面显示的就是网页的源代码。找到下图。

获取其中的 title 、docId 、docType 。代码如下:

def get_Id(sourse):Id=re.findall(r"docId.*?:.*?'(.*?)',",sourse)[0]return Iddef get_Type(sourse):Type=re.findall(r"docType.*?:.*?'(.*?)',",sourse)[0]return Typedef get_Title(sourse):Title=re.findall(r"title.*?:.*?'(.*?)',",sourse)[0]return Title

我们获取这些东西干啥呢?当然是获取 rsign 等信息了。

接下来我们要获取的信息在下面这个加载文件里:

不过这个链接我们最后的一部分可以不要,我们利用正则表达式获取 rsign 等信息,就可以拼接起正文内容的链接。

流程差不多就是上面这样,最后就是获取正文内容。

正文内容是 json 格式的,需要改变一些换行符等排版,接着保存就好,代码如下:

def parse_txt(Id):''':param Id: 之前爬取的 docId'''url1='https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id={}'.format(Id)content1=fetch_url(url1)md5=re.findall('"md5sum":"(.*?)"',content1)[0]pn=re.findall('"totalPageNum":"(.*?)"',content1)[0]rsign=re.findall('"rsign":"(.*?)"',content1)[0]url2 = 'https://wkretype.bdimg.com/retype/text/' + Id + '?rn=' + pn + '&type=txt' + md5 + '&rsign=' + rsigncontent2=json.loads(fetch_url(url2))result=''for items in content2:for item in items:result=result+item['c'].replace('r','r').replace('n','n')return result#保存为 txt 文件
def save_file(filename, content):with open(filename, 'w', encoding='utf-8') as f:f.write(content)print('已保存为:' + filename)

txt 文档基本就上面这样了,有的 url 链接可以去掉部分数字,所以看起来比原有的 url 更短。

接着是 doc 文件:

doc 的爬取借鉴了开头高手的代码,所以这里只想做个解读。

def parse_doc(content):result = ''url_list = re.findall('(https.*?0.json.*?)x22}', content)url_list = [addr.replace("/", "/") for addr in url_list]for url in url_list[:-5]:content = fetch_url(url)y = 0txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content)for item in txtlists:if not y == item[1]:y = item[1]n = 'n'else:n = ''result += nresult += item[0].encode('utf-8').decode('unicode_escape', 'ignore')return result

下面一步一步解释。

这个函数需要输入一个 content ,这个东西是代表网页源代码,在这里就是文档所在位置的网页源代码。

好的我们看下面这一句:

url_list = re.findall('(https.*?0.json.*?)x22}', content)

这个东西运行完,实际就是找到了下面这些内容:

要这些东西干嘛?我们看到下一个句子:

url_list = [addr.replace("/", "/") for addr in url_list]

就变成了一个个可以点击的 url 地址了,实际上对应的就是 Network 中加载文件的下图:

但是我们发现下面的一句:for url in url_list[:-5]

为什么只循环到倒数第五个呢?这里我们首先确保点击了“继续阅读”按钮,查找相关文件,发现最后一个符合要求的加载文件正好是 url_list 列表对应的倒数第五个元素。

说明 url_list 中最后面的元素并不是我们想要的东西。

后面的代码就是关于如何爬取 json 格式的字符串了以及保存(doc 文档同样在这里以 txt 文件保存),就不多解读了。

以及百度文库的 PPT PDF 爬取实在不想写了,模式和爬取 txt 文档类似。

说实话,感觉百度文库的爬取实在有点让人摸不清头脑,只求看懂以及思维的跳跃能够跟上。也算记录了一种心得吧。

最后附上 main()函数。

def main():url1 = input('请输入需要爬取的文库地址:')auto_page_search(url1)sourse=fetch_url(url1)Id=get_Id(sourse)Type=get_Type(sourse)Title=get_Title(sourse)if Type=='txt':result=parse_txt(Id)save_file(Title+'.txt',result)elif Type=='doc':result=parse_doc(sourse)save_file(Title+'doc',result)

go爬取json_Python爬取百度文库学习相关推荐

  1. 二十一、Python爬取百度文库word文档内容

    @Author:Runsen 百度文库在我们需要查找复制一些文档的时候经常用到,下载要收费,开会员,一个字都不给复制,这个时候初学python的小伙伴肯定有个写个百度文库爬虫的想法,这里我给各位分享一 ...

  2. 使用python中的Selenium爬取百度文库word文章

    参考文章:Python3网络爬虫(九):使用Selenium爬取百度文库word文章,链接为: https://blog.csdn.net/c406495762/article/details/723 ...

  3. Python网络爬虫(七):百度文库文章爬取器

    在用前面的方法爬取百度文库的文章时,发现只能爬取已显示出来的几页文章,而对于没有显示的页数则无法获得其内容.如果要完整的看到整篇文章,需要手动地点击底下的"继续阅读",使所有的页数 ...

  4. 写一个爬虫,可以爬取百度文库内容

    爬取百度文库内容需要使用爬虫技术.以下是一个简单的 Python 爬虫示例: import requestsurl ="https://wenku.baidu.com/view/your_d ...

  5. python爬取qq好友_Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)...

    一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...

  6. python爬取百度文库doc_Python百度文库爬虫之doc文件

    Python百度文库爬虫之doc文件 说明:此文件是在爬取txt文件下的基础进行的,因此重复内容会一笔带过,不懂请看前面爬取txt文件链接 对于文件的所有类型,我都会用一篇文章进行说明,链接: 一.网 ...

  7. python 爬虫——爬取百度文库VIP内容

    转载自:爬取百度文库 代码实现 import requests import re import json import ossession = requests.session()def fetch ...

  8. 利用Python进行百度文库内容爬取(二)——自动点击预览全文并爬取

    本文是衔接上一篇:<利用Python进行百度文库内容爬取(一)>. 上回说到我们在对百度文库进行爬虫时,需要模拟手机端来进行登录,这样固然可以对文章进行爬取,但是很多时候并不是非常智能的翻 ...

  9. python爬虫爬取百度文库txt以及ppt资料

    使用bs4,requests,re库完成对百度文库部分格式文件的爬取 案例中的目标文档地址: https://wenku.baidu.com/view/cbb4af8b783e0912a3162a89 ...

最新文章

  1. git 出现 fatal: refusing to merge unrelated histories 错误
  2. C++实现successive approximation渐进法(附完整源码)
  3. ComboBox的真实值和显示值
  4. 拦截请求并记录相应信息-springboot
  5. 合并bin文件-----带boot发布版本比较好用的bat(便捷版)
  6. html 按钮 按下 状态_第一次按下是启动,第二次按下是停止,俵哥分享2种接线方法...
  7. 计算机仿真电路实验感想,电路计算机仿真 实验报告.doc
  8. python安装好后打不开_解决安装pyqt5之后无法打开spyder的问题
  9. php自定义session存储路径
  10. altium 快速设置网络_通过加载CAD“快速选择”插件,可以很大的提高绘图效率...
  11. Demo:第四章:Gateway网关
  12. 安装“万能解码器”还原真实“解码”(纯以个人兴趣分析)
  13. pcb地线应该不应该做成环路_电源PCB设计流程及要点全解析
  14. excel合并两列内容_EXCEL数据合并、批量添加内容知识,高手嫌弃,新手太需要...
  15. i7台式电脑配置推荐_教您2019推荐组装台式电脑最新配置清单
  16. 生产计划排产软件三大操作流程
  17. [虚幻引擎] UE4/5数字孪生 制作城市光束效果
  18. Anaconda 修改文件保存路径
  19. Android 开源交流分享汇总
  20. Maya 凹凸贴图与置换贴图

热门文章

  1. 长沙理工大学计算机系教师,长沙理工大学数学与计算机科学学院导师介绍:王晚生...
  2. 二进制包 mysql_二进制包;mysql
  3. 某都计算机考研计算机组成原理,东北大学2000年考研真题-计算机组成原理
  4. 发布html页面图像不显示不出来,图像不显示htmlimg/
  5. Linux之Less命令跳转到特定的行号
  6. Python2和python3字符编码的区别
  7. xhprof安装使用【转】
  8. 建环计算机应用试题,环境建环和给水排水工程计算机应用教材内容
  9. 怎么看android底层源码,Android 底层按键获取
  10. cmyk图像处理matlab,数字图像处理及MATLAB实现 全套课件.pptx