全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1128|回复: 15

看有人需要下百度文库的源码,来这有一份

[复制链接]
发表于 2019-3-15 22:35:52 | 显示全部楼层 |阅读模式
  1. import requests
  2. import re
  3. import json
  4. import os

  5. session = requests.session()


  6. def fetch_url(url):
  7.     return session.get(url).content.decode('gbk')


  8. def get_doc_id(url):
  9.     return re.findall('view/(.*).html', url)[0]


  10. def parse_type(content):
  11.     return re.findall(r"docType.*?:.*?\'(.*?)\',", content)[0]


  12. def parse_title(content):
  13.     return re.findall(r"title.*?:.*?\'(.*?)\',", content)[0]


  14. def parse_doc(content):
  15.     result = ''
  16.     url_list = re.findall('(https.*?0.json.*?)\\\\x22}', content)
  17.     url_list = [addr.replace("\\\\\\/", "/") for addr in url_list]
  18.     for url in url_list[:-5]:
  19.         content = fetch_url(url)
  20.         y = 0
  21.         txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', content)
  22.         for item in txtlists:
  23.             if not y == item[1]:
  24.                 y = item[1]
  25.                 n = '\n'
  26.             else:
  27.                 n = ''
  28.             result += n
  29.             result += item[0].encode('utf-8').decode('unicode_escape', 'ignore')
  30.     return result


  31. def parse_txt(doc_id):
  32.     content_url = 'https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=' + doc_id
  33.     content = fetch_url(content_url)
  34.     md5 = re.findall('"md5sum":"(.*?)"', content)[0]
  35.     pn = re.findall('"totalPageNum":"(.*?)"', content)[0]
  36.     rsign = re.findall('"rsign":"(.*?)"', content)[0]
  37.     content_url = 'https://wkretype.bdimg.com/retype/text/' + doc_id + '?rn=' + pn + '&type=txt' + md5 + '&rsign=' + rsign
  38.     content = json.loads(fetch_url(content_url))
  39.     result = ''
  40.     for item in content:
  41.         for i in item['parags']:
  42.             result += i['c'].replace('\\r', '\r').replace('\\n', '\n')
  43.     return result


  44. def parse_other(doc_id):
  45.     content_url = "https://wenku.baidu.com/browse/getbcsurl?doc_id=" + doc_id + "&pn=1&rn=99999&type=ppt"
  46.     content = fetch_url(content_url)
  47.     url_list = re.findall('{"zoom":"(.*?)","page"', content)
  48.     url_list = [item.replace("\", '') for item in url_list]
  49.     if not os.path.exists(doc_id):
  50.         os.mkdir(doc_id)
  51.     for index, url in enumerate(url_list):
  52.         content = session.get(url).content
  53.         path = os.path.join(doc_id, str(index) + '.jpg')
  54.         with open(path, 'wb') as f:
  55.             f.write(content)
  56.     print("图片保存在" + doc_id + "文件夹")


  57. def save_file(filename, content):
  58.     with open(filename, 'w', encoding='utf8') as f:
  59.         f.write(content)
  60.         print('已保存为:' + filename)


  61. def main():
  62.     url = input('请输入要下载的文库URL地址_')
  63.     content = fetch_url(url)
  64.     doc_id = get_doc_id(url)
  65.     Type = parse_type(content)
  66.     title = parse_title(content)
  67.     if Type == 'doc':
  68.         result = parse_doc(content)
  69.         save_file(title + '.txt', result)
  70.     elif Type == 'txt':
  71.         result = parse_txt(doc_id)
  72.         save_file(title + '.txt', result)
  73.     else:
  74.         parse_other(doc_id)


  75. if __name__ == "__main__":
  76.     main()
复制代码




发表于 2019-3-15 22:39:53 | 显示全部楼层
战略性标记
发表于 2019-3-15 22:45:53 | 显示全部楼层
战略性mark
发表于 2019-3-15 22:46:05 | 显示全部楼层
本帖最后由 shares 于 2019-3-15 22:49 编辑

看见了
下载的是图片
如果能是源文档就完美了
还是谢谢了
发表于 2019-3-15 22:47:35 来自手机 | 显示全部楼层
不是可以直接下载原文档吗
发表于 2019-3-15 22:48:03 | 显示全部楼层
楼主666啊,标记一下
发表于 2019-3-15 22:49:15 | 显示全部楼层
来个教程啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-26 20:56 , Processed in 0.062250 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表