zoukankan      html  css  js  c++  java
  • 保存、下载 网盘文件,进度条展示下载状态

    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()
  • 相关阅读:
    [BZOJ 1066] [SCOI2007] 蜥蜴 【最大流】
    [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】
    [BZOJ 1070] [SCOI2007] 修车 【费用流】
    [BZOJ 1878] [SDOI2009] HH的项链
    [BZOJ 3110] [Zjoi2013] K大数查询 【树套树】
    [HDOJ 1171] Big Event in HDU 【完全背包】
    Shell基本语法---函数
    Shell基本语法---shell数组
    Shell基本语法---while语句
    Shell基本语法---for语句
  • 原文地址:https://www.cnblogs.com/lnd-blog/p/13793456.html
Copyright © 2011-2022 走看看