其他分享
首页 > 其他分享> > 百度文库下载---Studying

百度文库下载---Studying

作者:互联网

说明:该文章学习于:https://cuijiahua.com/

import requests
import re
import json
import os

#创建会话
session = requests.session()
'''
发送一个get请求
content:返回bytes类型的数据也就是二进制数据
text:返回的就是纯文本(Unicode类型的数据)
'''
def fetch_url(url):
    return session.get(url).content.decode('gbk')
'''
获取文档的ID名称
'''
def get_doc_id(url):
    return re.findall('view/(.*).html',url)[0]
'''
解析文件格式
'''
def pares_type(content):
    return re.findall(r"docType.*?\:.*?\'(.*?)\'\,",content)[0]
'''
解析提取title
'''
def parse_title(content):
    return re.findall(r"title.*?\:.*?\'(.*?)\'\,",content)[0]
'''
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次
'''
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 = 0
        txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),',content)
        for item in txtlists:
            if not y == item[1]:
                y = item[1]
                n = '\n'
            else:
                result += n
                result += item[0].encode('utf-8').decode('unicode_escape','ignore')
    return result
'''
json.loads 将已编码的JSON字符串解码为Python对象
'''
def parse_txt(doc_id):
    content_url = 'https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=' + doc_id
    content = fetch_url(content_url)
    md5 = re.findall('"md5sum":"(.*?)"',content)[0]
    pn = re.findall('"totalPageNum":"(.*?)"')
    rsign = re.findall('"rsign":"(.*?)"',content)[0]
    content_url = 'https://wkretype.bdimg.com/retype/text/' + doc_id + '?rn=' + pn + '&type=txt' + md5 + '&rsign' + rsign
    content = json.load(fetch_url(content_url))
    result = ''
    for item in content:
        for i in item['parags']:
            result += i['c'].replace('\\r','\r').replace('\\n','\n')
    return result
'''
os.path 模块主要用于获取文件的属性
os.path.exists(path) 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。
os.mkdir() 方法用于以数字权限模式创建目录。默认的模式为 0777 (八进制)
os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径
python open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。
'''
def parse_other(doc_id):
    content_url = "https://wenku.baidu.com/browse/getbcsurl?doc_id=" + doc_id + "&pn=1&rn=99999&type=ppt"
    content = fetch_url(content_url)
    url_list = re.findall('{"zoom":"(.*?)","page"', content)
    url_list = [item.replace("\\",'') for item in url_list]
    if not os.path.exists(doc_id):
        os.mkdir(doc_id)
    for index,url in enumerate(url_list):
        content = session.get(url).content
        path = os.path.join(doc_id,str(index) + '.jpg')
        with open(path,'wb') as f:
            f.write(content)
    print("图片保存在" + doc_id + "文件夹")

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

def main():
    url = input("请输入要下载的文库URL地址:")
    content = fetch_url(url)
    doc_id = get_doc_id(url)
    type = pares_type(content)
    title = parse_title(content)
    if type == 'doc':
        result = parse_doc(content)
        save_file(title + '.txt' , result)
    elif type == 'txt':
        result = parse_txt(doc_id)
        save_file(title + '.txt',result)
    else:
        parse_other(doc_id)


if __name__ == "__main__":
    main()

 

标签:文库,url,Studying,content,re,result,doc,id,百度
来源: https://www.cnblogs.com/aaron456-rgv/p/12496068.html