Python 自动化下载夸克网盘分享文件:基于 Playwright 的完整实现(含登录态持久化与提取码处理)

admin 千秋月 关注 管理组 LV20
发表于程序代码版块 技术杂文
完整python代码下载地址:


https://pan.xunlei.com/s/VOarac8im3LtvqIKfsk7fVc9A1?pwd=fdw2#

简介

通过 python 脚本下载已知提取码的夸克网盘分享的文件

原理介绍

使用 playwright 模拟浏览器输入提取码、点击下载按钮进行下载。文件的保存位置可以通过拦截下载事件另存至指定位置。
备注:由于夸克网盘下载时需要先登陆,所以使用 playwright 打开夸克网盘进行登陆,扫码登陆后将登陆状态存储在指定文件内,已备后续脚本下载时使用。

代码介绍

1.下载脚本是写在 class 中的,用来共享变量。
2.代码中“设置监听所有请求和响应”、“模拟人类行为”的功能可删除或自行编写
备注:playwright 不可重复创建浏览器实例,会报异常。

创建浏览器

创建 playwright 实例 --> 创建浏览器实例 --> 创建上下文(用来加载登录状态) --> 创建页面

def get_browser(self, headless: bool = None):
    """
    启动浏览器
    :return:
    """

    创建 playwright 实例
    print("创建 playwright 实例...")
    self.playwright = sync_playwright().start()
    self.chromium_args.append(f"--window-size={self.width},{self.height}")
    headless = self.headless if headless isNoneelse headless
    启动浏览器
    print("启动浏览器...")
    self.browser = self.playwright.chromium.launch(
        headless=headless,
        # channel='chrome',
        # channel='chromium',
        args=self.chromium_args,
    )
    从文件加载存储状态
    storage_state = None
    if self.storage_state_path and os.path.exists(self.storage_state_path):
        print("从文件加载存储状态...")
        withopen(self.storage_state_path, "r"as f:
            storage_state = json.load(f)
    创建浏览器上下文
    print("创建浏览器上下文...")
    self.browser_context = self.browser.new_context(
        storage_state=storage_state
        # user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
        # viewport={"width": 1920, "height": 1080},
        # locale='zh-CN',
        # # 设置时区
        # timezone_id="Asia/Shanghai",
    )

defget_page(self, headers: dict[strstr] = None) -> "Page":
    """
    获取新页面
    :param headers:
    :param browser_context:
    :return:
    """

    创建页面
    print("创建页面...")
    page = self.browser_context.new_page()
    设置额外的HTTP
    if headers:
        print("设置额外的HTTP...")
        page.set_extra_http_headers(headers)
    监听所有请求和响应
    print("监听所有请求和响应...")
    self.set_request_response_log(page)
    return page

登陆夸克并保存状态

创建状态存储文件的目录 --> 打开夸克网盘登陆页 --> 等待扫码登陆(等待行为是通过账户名称来实现到,请填入正确的账户名称),登陆后会自动保存浏览器状态到文件内。
备注:登录时需要 headless=False(显示浏览器页面)

def login_quark_and_save_state(self):
    """
    登陆夸克并保存状态此处需要使用显示在桌面的浏览器,用以账户登陆
    """

    确保目录存在
    directory = os.path.dirname(self.storage_state_path)
    if directory andnot os.path.exists(directory):
        print(f"创建目录{directory}")
        os.makedirs(directory)

    执行登录操作
    print("开始登录...")
    self.page.goto(self.quark_url)
    等待登录完成
    print("等待登录完成...")
    self.page.wait_for_selector(f"span:text('{self.username}')")

    保存浏览器状态到文件
    print("保存浏览器状态...")
    storage_state = self.browser_context.storage_state()
    withopen(self.storage_state_path, "w", encoding="utf-8"as file:
        json.dump(storage_state, file, indent=2, ensure_ascii=False)
    self.page.wait_for_timeout(20000)

下载夸克分享链接

创建文件存储目录 --> 访问分享链接 --> 等待页面加载完成 --> 输入提取码 --> 监听下载事件 --> 点击下载按钮 --> 文件另存为 --> 等待文件下载结束

def quark_download(self, share_url: str, extract_code: str, download_path: str, file_name: str,
                   page: "Page" = None):
    """
    下载文件
    :param share_url: 分享链接
    :param extract_code: 提取码
    :param download_path: 下载路径
    :param file_name: 文件名
    :param page:
    :return:
    """

    确保保存目录存在
    Path(download_path).mkdir(parents=True, exist_ok=True)
    page = page or self.page
    try:
        访问目标页面
        print(f"访问目标页面:{share_url}")
        response = page.goto(share_url, timeout=300000, )
        print("目标页面 status:", response.status)
        等待页面完全加载
        print("等待页面完全加载...")
        page.wait_for_load_state("networkidle")
        模拟人类行为
        print("模拟人类行为...")
        self.simulation_operation(page)
        输入提取码 XPath 选择器
        print("输入提取码...")
        input_element = page.locator("//input[@placeholder='请输入提取码,不区分大小写']")
        使用标准 CSS 选择器
        # input_element = page.locator("input[placeholder='请输入提取码,不区分大小写']")
        input_element.fill(extract_code)
        print("提取码已输入:" + extract_code)
        等待页面加载完成
        page.wait_for_load_state("networkidle")
        监听下载事件并下载文件
        print("正在等待下载...")
        with page.expect_download(timeout=30000as download_info:
            点击下载按钮
            share_download_btn = page.locator('.share-download').nth(0)
            share_download_btn.click()
            print("点击下载按钮...")
            等待下载开始
            download = download_info.value
            print(f"开始下载{download.suggested_filename}")
            获取下载文件名
            filename = download.suggested_filename
            file_name = f'{file_name}.{filename.split('.')[-1]}'if'.'in filename else filename
            指定完整保存路径
            full_save_path = Path(download_path) / file_name
            if full_save_path.exists():
                print(f"文件已存在删除{full_save_path}")
                os.remove(full_save_path)
            print(f"文件已下载到{full_save_path}")
            保存文件到指定位置
            download.save_as(full_save_path)
            等待文件保存完成
            print("等待文件保存完成...")
            count = 0
            whilenot os.path.exists(full_save_path):
                page.wait_for_timeout(1000)
                print("等待文件保存完成...")
                count = count + 1
                if count > self.download_timeout:
                    print(f"下载超时, url:{share_url}, code:{extract_code}, full_save_path:{full_save_path}")
                    break
            print("下载结束")
        page.wait_for_load_state("networkidle")
        return full_save_path
    except Exception as e:
        print(f"访问页面时发生错误{e}错误信息:{e.__dict__}")
        traceback.print_exception(e)
    finally:
        print(f'下载结束:{share_url}, code:{extract_code}')

夸克网盘登陆调用方法

if __name__ == '__main__':
    夸克网盘账户名称,请确保名称正确,否则登陆时会等待超时报错
    username = ''
    浏览器状态保存文件全路径或相对路径
    storage_state_path = "xxxxxx/login_state.json"
    
    登陆夸克,保存状态
    print("================================= 登陆夸克网盘 =================================")
    创建实例
    quark_download_util = QuarkDownloadUtil(username=username, storage_state_path=storage_state_path, headless=False)
    登陆
    quark_download_util.login_quark_and_save_state()
    关闭实例
    quark_download_util.close()
    print("================================= 登陆完成 =================================")

夸克网盘分享文件下载调用方法

if __name__ == '__main__':
    夸克网盘账户名称,请确保名称正确,否则登陆时会等待超时报错
    username = ''
    浏览器状态保存文件全路径或相对路径(请确保与登陆时保存的文件相同)
    storage_state_path = "xxxxxx/login_state.json"
    文件下载位置全路径或相对路径(目录文件)
    download_path = 'xxxxxx/Downloads'
    
    下载夸克分享链接
    print("================================= 开始下载 =================================")
    share_url = "https://pan.quark.cn/s/628ea3f1e1b2"
    extract_code = "vDLK"
    file_name = "-张远"
    quark_download_util = QuarkDownloadUtil(username=username, storage_state_path=storage_state_path, headless=True)
    quark_download_util.quark_download(share_url=share_url, extract_code=extract_code, download_path=download_path,
                                       file_name=file_name)
    quark_download_util.close()
    print("================================= 下载完成 =================================")

本文章最后由 admin2025-10-06 11:40 编辑
评论列表 评论
发布评论

评论: Python 自动化下载夸克网盘分享文件:基于 Playwright 的完整实现(含登录态持久化与提取码处理)



2026全面升级!对接公众号万级资源池 + 智能AI双驱动,速来体验! 外卖党必看!你吃外卖我买单!欢迎报名下单! AI人脸替换工具离线版,免费下载~ Image


免责声明
本站资源,均来自网络,版权归原作者,所有资源和文章仅限用于学习和研究目的 。 不得用于商业或非法用途,否则,一切责任由该用户承担 !

请求资源或报告无效资源,请点击[反馈中心>>]

电脑不给力运行不了?试试[高配云电脑>>]

常见问题一站式解决方案,点击进入解答区,随时为您解答![进入>>]


侵权删除请致信 E-Mail:2309931055@qq.com
已有0次打赏
(0) 分享
分享
取消