百度文库,文字类型的资源(如txt, doc, pdf),是可以在前端源码分析获取到的,如果能按照规则合理的提取这些文字资源,就可以实现免下载券获取资源.

作者完成了百度文库的在线版爬虫,只需提供文库资源页面的url,就可以获取对应的文库资源(免下载券)

####在线测试地址:

http://zhaozhaoli.vicp.io/spider/bdwk
复制代码

####效果展示

关于ppt的爬取,作者也写出来了,但是我的个人服务器带宽太小,导致前端等待时间过长,就把它注释了...有兴趣的可以看以前写过的这篇文章百度文库下载器,文章底部提供了编译好的可执行文件(支持ppt,txt,pdf,word格式的下载),可以下载到本地玩一玩...

核心源码:

import os
import re
import json
import requests
from lxml import etree
import sys
from fangyuanxiaozhan.settings import BASE_DIR# import tkinter# 创建文库基类
class BaiduWK(object):def __init__(self, url):self.title = Noneself.url = urlself.docType = Noneself.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'}self.get_response_content(self.url)self.get_doc_type_and_title()def get_response_content(self, url):try:response = requests.get(url, headers=self.headers)return response.contentexcept Exception as e:print(e)passdef get_doc_type_and_title(self):# 获取源码source_html = self.get_response_content(self.url)# 解析源码content = source_html.decode('gbk')# 获取文档类型self.docType = re.findall(r"docType.*?\:.*?\'(.*?)\'\,", content)[0]# 获取文档标题self.title = re.findall(r"title.*?\:.*?\'(.*?)\'\,", content)[0]# 创建获取txt的类
class BDWKTXT(BaiduWK):def __init__(self, url):super().__init__(url)self.docId = Nonepassdef get_txt(self, url):# 获取源码source_html = self.get_response_content(url)content = source_html.decode("gbk")# 获取docIdself.docId = re.findall(r"docId.*?(\w{24}?)\'\,", content)[0]# 拼接请求urltoken_url = "https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=" + self.docId# 再次请求first_json = self.get_response_content(token_url).decode()str_first_json = re.match(r'.*?\((\{.*?\})\).*', first_json).group(1)# print(str_first_json)the_first_json = json.loads(str_first_json)md5sum = the_first_json["md5sum"]rn = the_first_json["docInfo"]["totalPageNum"]rsign = the_first_json["rsign"]# print(md5sum,"-->",rn)# 请求目标urltarget_url = "https://wkretype.bdimg.com/retype/text/" + self.docId + "?" + md5sum + "&callback=cb" + "&pn=1&rn=" + rn + "&type=txt" + "&rsign=" + rsign# https://wkretype.bdimg.com/retype/text/de53bafaf705cc1755270982?md5sum=b89f055e765e6f73db57525bcfc3c2d2&sign=7b385f9cf7&callback=cb&pn=1&rn=12&type=txtsec_json = self.get_response_content(target_url).decode()# print(type(sec_json),"-->")str_sec_json = re.match(r'.*?\(\[(.*)\]\)$', sec_json).group(1)str_sec_json += ","str_json_list = str_sec_json.split('},')result_txt = ""# 截取尾部空格str_json_list = str_json_list[:-1]for str_json in str_json_list:str_json += "}"pure_dic = json.loads(str_json)pure_txt = pure_dic["parags"][0]["c"].strip()result_txt += pure_txt# 创建文件目录try:# path = "." + os.sep + self.docTypepath = BASE_DIR + "/static/spider_file/bdwk" + os.sep + self.docTypeprint(type(path),"path-->",path)os.makedirs(path)except Exception as e:# print("文件夹%s已存在"%(path))pass# 创建文件,保存信息try:print(os.path)file_name = BASE_DIR+"/static/spider_file/bdwk" + os.sep + self.docType + os.sep + self.title + ".txt"with open(file_name, 'w', encoding='utf-8') as f:f.write(result_txt)print("已经保存为:", self.title + '.txt')except Exception as e:# print(e)pass# 创建获取word的类
class BDWKDOC(BaiduWK):def __init__(self, url):super().__init__(url)# 保存数据来源urlself.pure_addr_list = list()# 获取数据来源urldef get_pure_addr_list(self):# 获取页面源码source_html = self.get_response_content(self.url).decode('gbk')# 从源码中批量提取数据urlall_addr = re.findall(r'wkbos\.bdimg\.com.*?json.*?expire.*?\}', source_html)pure_addr_list = list()# 获取文档标题self.title = etree.HTML(source_html).xpath("//title/text()")[0].strip()# 净化数据来源url列表for addr in all_addr:addr = "https://" + addr.replace("\\\\\\/", "/")addr = addr[:-5]pure_addr_list.append(addr)# 将处理好的url列表保存为全局属性self.pure_addr_list = pure_addr_listreturn pure_addr_list# 从数据来源的url列表中提取数据def get_json_content(self, url_list):content = ''result = ''sum = len(url_list)i = 1for pure_addr in url_list:print("正在下载第%d条数据, 剩余%d条" % (i, sum - i))i += 1try:# 获取json数据content = self.get_response_content(pure_addr).decode()# 处理json数据content = re.match(r'.*?\((.*)\)$', content).group(1)# 将json数据中需要的内容提取出来all_body_info = json.loads(content)["body"]# 遍历获取所有信息,并将信息拼接到一起for body_info in all_body_info:try:result = result + body_info["c"].strip()# print(">>",result)except Exception as e:print(e)passexcept Exception as e:print(e)pass# 创建文件目录try:path = BASE_DIR+"/static/spider_file/bdwk" + os.sep + self.docType# print(type(path),"path-->",path)os.makedirs(path)except Exception as e:# print("文件夹%s已存在"%(path))pass# 创建文件,保存信息try:file_name = BASE_DIR+"/static/spider_file/bdwk" + os.sep + self.docType + os.sep + self.title + ".txt"with open(file_name, 'w', encoding='utf-8') as f:f.write(result)print("已经保存为:", self.title + '.txt')except Exception as e:print(e)# 创建获取ppt的类
class BDWKPPT(BaiduWK):def __init__(self, url):self.all_img_url = list()super().__init__(url)# 获取json数据保存文件def get_ppt_json_info(self):# 获取源文件ppt_source_html = self.get_response_content(self.url)# 解析源文件content = ppt_source_html.decode('gbk')# 测试with open("test.html", "w") as f:f.write(content)# 获取文档Idself.docId = re.findall(r"docId.*?(\w{24}?)\'\,", content)[0]# 拼接请求json的接口source_json_url = 'https://wenku.baidu.com/browse/getbcsurl?doc_id=%s&type=ppt&callback=zhaozhao' % self.docId# 获取字符串类型的json数据str_source_json = self.get_response_content(source_json_url).decode()# 处理字符串类型的json数据,使其成为标准格式pure_str_source_json = re.match(r'.*?\((.*?)\)', str_source_json).group(1)# 将字符串json转为可处理的正式jsonsource_json = json.loads(pure_str_source_json)# 遍历字典中的数据类型listfor j in source_json['list']:# 创建临时列表temp_num_url = list()# 将url和page拼接到列表中temp_num_url.append(j["zoom"])temp_num_url.append(j["page"])# 将列表信息添加到全局变量中self.all_img_url.append(temp_num_url)# 建立文件夹try:os.makedirs(BASE_DIR+"/static/spider_file/bdwk/ppt/%s" % (self.title))except Exception as e:passfor img_url in self.all_img_url:print(BASE_DIR+"正在获取第%d页资源(剩余%d页)" % (img_url[1], len(self.all_img_url) - img_url[1]))data = self.get_response_content(img_url[0])path = BASE_DIR+"/static/spider_file/bdwk/ppt/%s/%s" % (self.title, str(img_url[1]) + '.jpg')with open(path, 'wb') as f:f.write(data)print("写入完毕")# 运行主程序
def main(url):try:# url = input("请输入资源所在的网址:")docType = BaiduWK(url).docTypeexcept:print("您输入的url,有误请重新输入!")os.exit()print("类型为", "-->", docType)if docType == "ppt2":ppt = BDWKPPT(url)print("您将要获取的演示文稿(ppt)名称为:", ppt.title)ppt.get_ppt_json_info()data = dict()src = "/static/spider_file/bdwk/ppt/%s/" % (ppt.title)title_name = ppt.titledata["src"] = srcdata["title_name"] = title_namereturn dataelif docType == "doc":word = BDWKDOC(url)print("您将要获取的文档(word)名称为", word.title)pure_addr_list = word.get_pure_addr_list()word.get_json_content(pure_addr_list)data = dict()src = "/static/spider_file/bdwk/doc/%s.txt" % (word.title)title_name = word.titledata["src"] = srcdata["title_name"] = title_name+".txt"return dataelif docType == "pdf":pdf = BDWKDOC(url)print("您将要获取的PDF名称为:", pdf.title)pure_addr_list = pdf.get_pure_addr_list()pdf.get_json_content(pure_addr_list)data = dict()src = "/static/spider_file/bdwk/pdf/%s.txt" % (pdf.title)title_name = pdf.titledata["src"] = srcdata["title_name"] = title_name+".txt"return dataelif docType == "txt":txt = BDWKTXT(url)print("您将要下载的文本文档(txt)名称为:", txt.title)txt.get_txt(url)data = dict()src = "/static/spider_file/bdwk/txt/%s.txt" % (txt.title)title_name = txt.titledata["src"] = srcdata["title_name"] = title_name+".txt"return dataelse:other = BDWKPPT(url)print("暂不支持下载%s类型" % (other.docType))data = dict()data["src"] = ""data["title_name"] = "暂不支持%s类型"%(other.docType)return data复制代码

《脚本》Python在线百度文库爬虫(免下载券)相关推荐

  1. python爬去百度文库资料_Python在线百度文库爬虫(免下载券)

    百度文库,文字类型的资源(如txt, doc, pdf),是可以在前端源码分析获取到的,如果能按照规则合理的提取这些文字资源,就可以实现免下载券获取资源. 作者完成了百度文库的在线版爬虫,只需提供文库 ...

  2. python百度文库免费_Python在线百度文库爬虫(免下载券)

    百度文库,文字类型的资源(如txt, doc, pdf),是可以在前端源码分析获取到的,如果能按照规则合理的提取这些文字资源,就可以实现免下载券获取资源. 作者完成了百度文库的在线版爬虫,只需提供文库 ...

  3. 百度文库搜索0下载券文档的方法:删除VIP这段代码就行。

    正常时,把搜索条件选为0下载券,会提示你加入VIP,真恶心. 按图中方法,先把搜索条件选为0下载券搜索,提示上面右键,审查元素,删除VIP这段代码就行. 可以用360浏览器 广告拦截插件,选手动屏蔽网 ...

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

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

  5. Python百度文库爬虫之txt文件

    Python百度文库爬虫之txt文件 说明: 对于文件的所有类型,我都会用一篇文章进行说明,链接: Python百度文库爬虫之txt文件 Python百度文库爬虫之doc文件 Python百度文库爬虫 ...

  6. python 百度文库 签到_Python百度文库爬虫终极版

    百度文库爬虫 我们在开始爬虫之前,首先要了解网页的信息和结构,然后获取请求的url和参数(payloads)来得到所要的数据并处理.接下来我们根据: 一.网页分析 二.爬虫编写 三.运行与结果 四.程 ...

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

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

  8. selenium python文档_selenium+python实现百度文库word文档抓取

    更新这个代码最近又改了一点,另外和其他一些小程序一起放在了一个jupyter notebook里,现在挂在github上面.github现在对jupyter notebook的支持非常的好,甚至可以直 ...

  9. 百度文库文件等待下载

    记录下百度文库免费下载网址,不要方到用时方恨晚.哈哈,以后有用的着的地方. 需要vip或者下载卷的文库下载 http://www.1234866.com/ 文库下载 (人民币不行) http://yz ...

最新文章

  1. 什么是物联网的边缘计算?
  2. 没有可用于当前位置的源代码
  3. 上位机多个下位机modbustcp通讯_【C#上位机】西门子1200PLC实用定位控制程序案例...
  4. gpu处理信号_GPU显卡不仅用来打游戏那么简单,它还可以用于通用加速计算
  5. python爬虫网络请求超时_Python网络爬虫编写5-使用代理,处理异常和超时
  6. php系统如何连接数据库服务器,php如何连接数据库服务器
  7. 【报告分享】2020快手电商生态报告.pdf(附下载链接)
  8. linux db2在线备份,DB2 pureScale在线备份恢复实例
  9. python实现语义分割_如何用PyTorch进行语义分割?一文搞定
  10. 2021奥斯汀 Pwn2Own黑客大赛落幕,Master of Pwn 诞生
  11. Hyperledger fabric 链码容器是一直运行的吗
  12. Python炸弹人小游戏源代码
  13. u盘被写保护了无法格式化怎么办?
  14. 【STM32Cube笔记】16-STM32Cube个性化定制
  15. 蓝桥杯 明码题解 【Java实现】
  16. springboot干什么的_SpringBoot是什么?干嘛用的?新手入门看这一篇就够了
  17. 「ZigBee模块」基础实验(4)定时器T1的简单应用
  18. 免费试用腾讯云服务器 + nginx建网站
  19. AWS EFS vs EBS vs S3(差异和何时使用?)
  20. Android批量打包

热门文章

  1. 转载:Docker从入门到上瘾
  2. Go使用qrcode包解析微信和支付宝二维码,生成一个链接(前端拿到链接即可解析成对应的支付二维码)
  3. 学习笔记之MyEclipse里各个文件名前的小标记都代表的意思
  4. 玩 ChatGPT 的正确姿势「GitHub 热点速览 v.22.49」
  5. RIGOL DS1102D示波器说明及纹波、上电脉冲、时序测试
  6. sfpatcher:针对应用商店的apk增量算法
  7. Git、GitLab这辈子的错都报完了 You have not concludedUnlink of file、 Pulling is not possible、Your local changes
  8. SSM整合之CRUD增删改查案例(非ajax版)
  9. csr_matrix详细解读
  10. res.data, res.data.data, res.data.data.rows的含义