此文章讲基于百度文库文章提取器设计思路的代码实现,如果你还不知道爬取百度文库文章的思路请移步:百度文库文章提取器(上)

git仓库地址:https://github.com/redstarbrother/wkspider

URL访问

# request请求函数,返回网页源码
def fetch_url(url):global versiontry:content = requests.get(url).content.decode("gbk")except UnicodeDecodeError:                              # 捕获编码异常,如果有异常说明为新版本页面,用utf-8格式解码content = requests.get(url).content.decode("utf-8")version[0] = 1return content

version变量是一个包含两个元素的列表,分别代表文章版式(新版or旧版)和文章类型(doc、txt…)。函数访问传入的url,将response的内容进行gbk解码,如果出现异常则说明需要用utf-8格式解码(根据实测,旧版文章只能gbk解码,而新版文章只能utf-8解码),同时令version[0]=1。

判断文章类型

# 判断文档类型
def verjud(content):if version[0] == 0:version[1] = re.findall(r"docType.*?\:.*?\'(.*?)\'\,", content)[0]      # 通过正则获取文档类型# print(version[1])# print(type(version[1]))else:if "indexXreader" in content:version[1] = "doc"elif "indexTxt" in content:version[1] = "txt"# print(version[1])

如果是旧版,在网页源码中可以通过正则找到docType后面的文章类型。如果是新版,在网页源代码的最下方有且仅有indexXreaderindexTxt,分别代表doc和txt。

旧版doc文章爬取

# 旧版doc文档
def old_doc(content):url_list = re.findall(r'(https.*?0.json.*?)\\x22}', content)        # 提取文章所有页链接url_list = [addr.replace("\\\\\\/", "/") for addr in url_list]      # 删掉转义字符result = []for url in url_list[:int(len(url_list)/2)]:                         # 提取的链接只需要用前一半content = fetch_url(url)temp = ""y = 0txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content)for item in txtlists:if not y == item[1]:y = item[1]n = '\n'else:n = ''temp += ntemp += item[0].encode('utf-8').decode('unicode_escape', 'ignore')result.append(temp)return result

通过正则将所有文章页的URL提取出来,在通过replace方法剔除链接中的转义字符,此时的URL才是可以访问的。遍历访问url_list并将文章内容提取出来。

新版doc文章爬取

# 新版doc文档
def new_doc(content):url_list = re.findall(r'(https:\\\\/\\\\/wkbjcloudbos.*?0.json.*?)\\', content)  # 提取文章所有页链接url_list = [addr.replace(r"\\", "") for addr in url_list]                        # 删掉转义字符result = []for url in url_list[:int(len(url_list))]:                                        # 此版本文库没有多余链接content = fetch_url(url)temp = ""txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content)y = 0for item in txtlists:if not y == item[1]:y = item[1]n = '\n'else:n = ''temp += ntemp += item[0].encode('utf-8').decode('unicode_escape', 'ignore')result.append(temp)return result

和旧版doc文章除正则表达式其他基本相同。

新版txt文章爬取

# 新版txt文档
def new_txt(content):txtId = re.findall("show_doc_id\":\"(.*?)\"", content)[0]      # 获取文档idmd5 = re.findall("md5sum=(.*?)&", content)[0]                   # 获取md5sum值sign = re.findall("sign=(.*?)\"", content)[0]                   # 获取sign值pageNum = re.findall("\"page\":\"(.*?)\"", content)[0]          # 获取文档总页码数resign = re.findall("\"rsign\":\"(.*?)\"", content)[0]          # 获取resign值url = "https://wkretype.bdimg.com/retype/text/" + txtId + "?md5sum=" + md5 + "&sign=" + sign + "&callback=cb&pn=1&rn=" + pageNum +\"&type=txt&rsign=" + resign                                 # 拼接字符串获取文档链接# print(url)# text = requests.get(url).content.decode('gbk')txtcontent = json.loads(fetch_url(url)[3:-1])               # 加载json格式文档result = []for item in txtcontent:temp = ""for i in item['parags']:temp += i['c'].replace('\\r', '\r').replace('\\n', '\n')result.append(temp)return result

在网页源代码中分别获取txtId、md5、sign、pageNum、resign,然后拼接URL并访问,在返回的数据中提取文章内容。

“主函数”

def getarticle(url):# url = "https://wenku.baidu.com/view/dbc53006302b3169a45177232f60ddccda38e63d.html?rec_flag=default&sxts=1584344873233" # 旧版doc# url = "https://wenku.baidu.com/view/62906818227916888486d74f.html?rec_flag=default"                                     # 新版doc# url = "https://wenku.baidu.com/view/ccfb5a96ba68a98271fe910ef12d2af90242a8f5.html?from=search"                          # 新版txt# url = input('请输入要下载的文库URL地址')# return ["123", "456"]content = fetch_url(url)verjud(content)message = []if version[0] == 0:if version[1] == "doc":message = old_doc(content)elif version[1] == "txt":message = old_txt(content)else:passelse:if version[1] == "doc":message = new_doc(content)elif version[1] == "txt":message = new_txt(content)else:pass# for item in message:#     print(item)#     print("*"*50)return message

函数最后message是一个列表,每个元素对应的就是所爬取文章每页的内容。

文章只展示部分代码,需要所有源码请到GitHub自行下载。

原文链接: https://www.jhxblog.cn/article/?articleid=21

百度文库文章提取器(下)相关推荐

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

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

  2. 如何免费下载百度文库文章的三种方法

    百度文库中的资源很丰富,但那里的文章不能复制,而且有的要下载币.给 大家总结下免费下载复制百度文库的三种方法. 第一种 利用百度快照.我们在百度文库中找到自己想要的文章后,直接把那篇文章的地址复制, ...

  3. 怎样下载百度文库文章

    百度文库的大部分文章都需要积分才能下载,并且无法复制,那么我们没有积分又想要复制或者下载百度文库的内容怎么办呢? 1.首先我们使用chrome浏览器打开文库地址. 2.然后我们右键选择打印. 然后我们 ...

  4. 关于提取百度文库无法复制的正文内容方法

    打开任意一篇百度文库文章(可以是VIP或者付费文档) 然后摁F12在console处输入jQuery('div.ie-fix').text()再回车,即可复制所有内容. 对于格式问题,粘贴到wrod中 ...

  5. 百度文库限制解除-汇总

    前言 title: 百度文库限制解除-汇总 comments: true date: 2020-12-09 12:29:42 updata:none 本文主要总结了百度文库(或者类似百度文库的平台)不 ...

  6. python实例100例百度文库-18个Python爬虫实战案例(已开源)

    目录 爬虫小工具 文件下载小助手 爬虫实战 笔趣看小说下载 VIP视频下载 百度文库文章下载_rev1 百度文库文章下载_rev2 <帅啊>网帅哥图片下载 构建代理IP池 <火影忍者 ...

  7. 利用百度文库实现精准引流

    中国有句很有名的俗话叫"灯下黑",什么意思呢?说白了就是最明显地方是最容易被忽略的. 在互联网引流方面也是如此,很多人天天喊着不知道怎么引流,殊不知百度这个最大的流量池就摆在你的眼 ...

  8. 如何免费使用百度文库

    随笔小文: 目的: 对一些不能免费下载和浏览的百度文库文章进行操作,以达到免费使用的目的. 方法: 对随意一篇百度文库,在其链接中加vvv如.baidu.com则在du.com中间加3个v(vvv). ...

  9. 怎样才能上传百度文库,上传百度文库的操作步骤和技巧

    百度文库上面有着丰富的知识分享,很多人找资料时都会上百度文库下载一些文档.而对于网络营销来说,百度文库由于拥有较高的权重,因此在百度上有着很好的排名.这样意味着如果能在上传的百度文库中加入企业信息,将 ...

  10. 远洋整站下载器不能用https_这可能是最全最好的爆破百度文库下载指南了!

    日常生活中,无论各行各业,我相信,你一定用过某下载文档资料的平台,比如说,百度文库. 有时候,为了赶交一篇论文或者下载一些考试真题,百度搜了半天资料,刚刚找到一个觉得蛮不错的打算下载,结果... 要么 ...

最新文章

  1. TensorFlow中的计算图
  2. 支持向量回归_量化投资学习笔记22——回归分析:支持向量机
  3. 算力网络 — 东数西算与算力网络
  4. I - The Mad Mathematician FZU - 2042(未解决)
  5. Windows平台RTMP推送|轻量级RTSP服务实现本地摄像头|屏幕|叠加数据预览
  6. java生成j动态页面_zk动态产生多个页面的例子代码
  7. React 第五章 state 组件生命周期
  8. c++ 遍历list_小白学PyTorch | 6 模型的构建访问遍历存储(附代码
  9. antd vue form表单 子组件调用父组件的方法没反应_前几天推了Vue,今天给React疯狂打call...
  10. 安装Windows Server 2008 测试机
  11. 普通文件与迅雷、旋风、快车、RayFile的下载地址转换算法
  12. 禁用word公式编辑器
  13. 肿瘤 材料 计算机模拟,PeerJ: 计算机模拟揭示癌症多样性
  14. 2022年大一学生实训作业【基于HTML+CSS制作中华传统文化传统美德网站 (6页面)】
  15. 冰桶挑战引来了百度搜索冰桶算法
  16. 【C语言上机练习题目-代码+运行结果】
  17. 毕业设计实用模型(四)——回归模型的实现(R语言)
  18. python声音可视化_声音的可视化处理
  19. 贾扬清、李沐、陈天奇:如何看待国内开源现状?
  20. danpianji与ros通信_ROS和Arduino通讯新模式——StandardFirmata

热门文章

  1. 附合导线坐标计算例题_闭合附合导线计算(课件例题)
  2. 关于keil注册机的问题
  3. 车辆运动控制(2)车辆横摆动力学建模
  4. 常见设计规范与 Sketch 源文件下载集合
  5. 典型ieee3机9节点电力系统潮流分析_【最新学术进展】清华大学电机系牵头研究推出高比例可再生能源电力系统标准测试系统HRP38...
  6. 【ELAMN预测】基于布谷鸟算法优化ELMAN神经网络实现数据回归预测matlab代码
  7. c语言开方不是整数怎么表示,c语言中的开方本人自学c语言,想请问在c中类似开方,取绝对值这类的(也不知道应该算运算符还是函数什么的)都要怎么解决~麻...
  8. c语言顺序栈的基本操作
  9. AT89C51单片机的8位竞赛抢答器的protues仿真设计_倒计时可调
  10. 2021-05-30