保存、下载 网盘文件,进度条展示下载状态

import requests
import os
import sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 下载百度云文件
# 如果过期请自己手动更换
cookie = "PSTM=1587863792; BIDUPSID=528CEBCD580978A65D8183F0F8D178C5; BAIDUID=4F866DED89BD4C5828831B99910EA8C0:SL=0:NR=10:FG=1; PANWEB=1; MCITY=-%3A; pan_login_way=1; BDUSS=lJrMGpGVHVueGQxQ2VDb3VabHlHMHVwVWxROE1pQ1c0NEdPWk5Semg3MlZqNUZmSVFBQUFBJCQAAAAAAAAAAAEAAAC2C8h7v-zA1sDWaGFoYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUCal-VAmpfN; BDUSS_BFESS=lJrMGpGVHVueGQxQ2VDb3VabHlHMHVwVWxROE1pQ1c0NEdPWk5Semg3MlZqNUZmSVFBQUFBJCQAAAAAAAAAAAEAAAC2C8h7v-zA1sDWaGFoYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUCal-VAmpfN; STOKEN=4b10bae481fb22c2568ca13de94f39831c5dbe1f6f5e2abbadd6733054c0cbff; SCRC=d536a0d863e50542b5a952cf03d0b973; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDCLND=9%2Fg%2FRjt87wBhH7GQzysO1WrlA0vePGJ5ubVsd03N29I%3D; delPer=0; PSINO=1; H_PS_PSSID=32820_32617_1420_31660_32706_32230_7516_32115_32718_22157; Hm_lvt_7a3960b6f067eb0085b7f96ff5e660b0=1602310772,1602310795,1602310922,1602311003; Hm_lpvt_7a3960b6f067eb0085b7f96ff5e660b0=1602311003; PANPSC=18386959497552224725%3AKkwrx6t0uHA8Ci%2BUotfp7Tuv496EomYGclEm%2BBBYRJpxJdPFNyV%2FWHwIyfKULKsKCOfgdHnp149Xegu8YAJYaBQRAggk1W3ri9SM%2B9wn5ca5sBnTZnAP1GT%2FMK3iZvOokLmws8hilRGrRlCzpJud7l9l5VLCkYtGsG7YZLnfZ%2BWv%2BjYtLTMR3kI0NZhR03fFueSOQr2pfpJ9bfFV5UX2VQ%3D%3D"
user_data_dir = r"user-data-dir=C:UsersAdministratorAppDataLocalGoogleChromeUser Data"


class Bd_method():

    def __init__(self, filename, path):
        # 文件名
        self.filename = filename
        # 文件夹
        self.path = path
        self.s = requests.session()
        self.file_path = os.path.join(path, filename).replace("/", "%2F").replace("\", "%2F")
        # 下载地址
        self.Download_addres = 'https://pcs.baidu.com/rest/2.0/pcs/file?method=download&app_id=309847&path={}'.format(self.file_path)
        # 下载请求头
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
            # "Host":"pan.baidu.com",
            "Cookie": cookie
        }

    # 下载
    def download_file(self):
        """
        :param filename:百度网盘文件名
        :param path:百度网盘路径“/xxx/xxx/“
        :return:
        """

        # 如果文件存在,获取文件大小,断点续传继续下载
        # 剩余下载长度 默认-1 表示没下载过
        remaining_byte = -1
        # 默认文件大小为0
        first_byte = 0
        # 获取文件长度
        response = self.s.get(self.Download_addres, headers=self.headers, stream=True)
        # 判断cookie是否已过期
        if response.status_code!=200:
            if response.status_code == 404:
                print('文件不存在')
            else:
                print("cookie过期")
            return False
        # 获取文件大小
        response_byte = response.headers['content-length']
        print("本次下载的文件大小为:", response_byte)
        if os.path.exists(self.filename):
            # 当前文件的大小
            first_byte = os.path.getsize(self.filename)
            print("当前文件大小:", first_byte)
            # 剩余文件长度
            remaining_byte = int(response_byte) - int(first_byte)
            print("剩余下载大小", int(remaining_byte))
        # 判断文件是否下载过
        if remaining_byte == 0:
            print("文件已下载过")
            return self.filename
        self.headers['Range'] = "bytes={}-{}".format(first_byte, response_byte)
        r = self.s.get(self.Download_addres, headers=self.headers, stream=True)
        # 写入文件
        with open(self.filename, "ab")as f:
            # 每次写入512字节
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    first_byte += len(chunk)
                    f.write(chunk)
                    f.flush()
                    ###这是下载实现进度显示####
                    done = int(50 * int(first_byte) / int(response_byte))
                    sys.stdout.write("
[%s%s] %d%%" % ('' * done, ' ' * (50 - done), 100 * int(first_byte) / int(response_byte)))
                    sys.stdout.flush()
        print("")
        return self.filename




# 保存
def save_file(file_url, password, user_data):
    # 配置调起保存数据的浏览器
    chrome_options = Options()
    chrome_options.add_argument(user_data)
    driver = webdriver.Chrome(chrome_options=chrome_options)
    # 输入网址
    driver.get(file_url)
    try:
        # 输入密码
        driver.find_element_by_xpath('//input[@id="accessCode"]').send_keys(password)
        # 点击【提取文件】
        driver.find_element_by_xpath('//div[@id="submitBtn"]//span[@class="text"]').click()
    except:
        pass
    # 隐式等待10s
    driver.implicitly_wait(10)
    # 获取文件名称
    pan_file_name = driver.find_element_by_xpath('//h2[@class="file-name"]').text
    print(pan_file_name)
    # 拼接文件在网盘中的路径
    pan_file_path = "/"
    print(pan_file_path)
    # 点击【保存到网盘】
    driver.find_element_by_xpath('//span[text()="保存到网盘"]').click()
    # 点击【确定】
    driver.find_element_by_xpath('//span[text()="确定"]').click()
    driver.close()
    return pan_file_name, pan_file_path


    pass
if __name__ == '__main__':
    print(__name__)
    save_file_path = 'https://pan.baidu.com/s/1UFKjEIxNFIazTKkZJFixhg'
    save_file_password = '9f33'
    pan_file_name, pan_file_path = save_file(save_file_path, save_file_password, user_data_dir)
    print(pan_file_name, pan_file_path)
    bd = Bd_method(pan_file_name, pan_file_path)
    bd.download_file()
原文地址:https://www.cnblogs.com/lnd-blog/p/13793456.html