下载某音频站,配合插件,本地记录,文件处理

记得要手动登录一次,即可。

使用时间 过多时,有验证码?但不确定出现时间,所以在程序段中无法加入。等有机会时加入即可。哪怕是手工。

完整代码:

复制代码
import time

from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import os
import re
import time


class BasePage:
    def __init__(self):
        edge_user_data_dir = r"C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default"
        edge_options = Options()
        edge_options.use_chromium = True
        # edge_options.add_argument('--disable-extensions')  # 禁用浏览器扩展
        edge_options.add_argument('--disable-gpu')  # 禁用GPU硬件加速
        # edge_options.add_argument('--headless')  # 禁用GPU硬件加速
        extension_path = (r'c:\edge_adds\0.0.8_0.crx')

        edge_options.add_extension(extension_path)

        edge_options.add_argument(f"--user-data-dir={edge_user_data_dir}")
        self.driver = webdriver.Edge(options=edge_options)
        self.driver.maximize_window()
        self.wait = WebDriverWait(self.driver, 50)
        # self.driver = driver
        # self.driver.implicitly_wait(10)

    def keep_browser_open(self):
        """保持浏览器窗口打开,等待用户操作."""
        input("按回车键退出程序并关闭浏览器...")
    def js_condition(self,driver):
        """自定义等待条件函数,检查JavaScript返回值"""
        return driver.execute_script("return document.readyState") == "complete"
    def open_url(self,url):
        self.driver.get(url)
        self.wait.until(self.js_condition)
        print("页面加载完成")
        return True

    def _find_element(self, loc):
        try:
            return self.wait.until(EC.element_to_be_clickable(loc))
        except Exception as e:
            print(f"元素未找到:{loc}")
            return False

    def find_elements(self, loc):
        elements = self.wait.until(EC.presence_of_all_elements_located(loc))
        if not elements:  # 可选:检查是否找到元素,如果没有,打印提示信息
            print(f"没有找到匹配的元素:{loc}")
        return elements

    def click_element(self,loc):
        element = self._find_element(loc)
        element.click()
        time.sleep(3)
        # self.driver.execute_script("arguments[0].click();", element)

    def rename_first_mp3_file_with_counter_and_timeout(self, directory, new_name, timeout_seconds=30):
        """
        查找指定目录下以字母或数字开头的第一个.mp3文件,并对其重命名。
        如果重命名后的文件名已存在,则自动追加序号(如 _1, _2)。
        如果在指定时间内未找到符合条件的文件,则结束等待并退出。

        :param directory: 字符串,指定的文件夹路径。
        :param new_name: 字符串,新的主文件名(不包含扩展名)。
        :param timeout_seconds: 整数,等待的最长时间(秒)。
        """
        # 确保路径以正确的分隔符结尾
        directory = os.path.join(directory, '')

        # 正则表达式,匹配以字母或数字开头的.mp3文件
        pattern = re.compile(r'^[a-zA-Z0-9].*\.mp3$')

        # 初始化计数器和开始时间
        counter = 0
        start_time = time.time()

        # 循环直到找到文件或超时
        while time.time() - start_time < timeout_seconds:
            found = False
            for filename in os.listdir(directory):
                if pattern.match(filename):
                    found = True
                    # 构建带有计数器的新文件名
                    suffix = f"_{counter}" if counter > 0 else ""
                    new_filename = os.path.join(directory, f"{new_name}{suffix}__{filename[:-4]}.mp3")

                    # 构建原始文件完整路径
                    original_file = os.path.join(directory, filename)

                    # 尝试重命名文件,如果失败且原因是文件已存在,则增加计数器并重试
                    while True:
                        try:
                            os.rename(original_file, new_filename)
                            # print(f"文件 {filename} 已重命名为 {new_filename}")
                            return  # 成功重命名后直接返回
                        except FileExistsError:
                            counter += 1  # 文件已存在,增加计数器
                            suffix = f"_{counter}"
                            new_filename = os.path.join(directory, f"{new_name}{suffix}_{filename[:-4]}.mp3")
                            print(f"文件 {new_filename} 已存在,尝试下一个序号...")
                        except Exception as e:
                            print(f"重命名 {filename} 时发生错误:{e}")
                            return  # 发生其他错误也直接返回

                    # 重命名成功后直接跳出外层循环
                    break

            # 如果当前循环没有找到符合条件的文件
            if not found:
                print("当前未找到符合条件的文件,稍候重试...")
                time.sleep(1)  # 等待一秒再次检查

        # 超时后仍未找到文件
        print(f"等待超时({timeout_seconds}秒),未找到符合条件的文件。")



aigei = BasePage()
aigei.open_url("https://www.aigei.com/sound/class/animal")
is_go=input("请打开自动下载,完成后输入go:")
next_loc=By.XPATH,"//span[contains(text(), '下一页')]"
current_page=1
while True:
    is_next=aigei._find_element(next_loc) is not None
    if is_next:
        if is_go=="go":
            loc=By.CSS_SELECTOR,'div.unit-container-list > div'
            eles=aigei.find_elements(loc)
            print(len(eles))
            for index,ele in enumerate(eles):
                title=ele.find_element(By.CSS_SELECTOR,'span.title-name').text+f"_{current_page}_{index+1}__"
                ell_play=ele.find_element(By.CSS_SELECTOR,'span.audio-player-btn').click()
                # wait = WebDriverWait(aigei.ele, 10)  # 最多等待10秒
                # ell_play = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'span.audio-player-btn')))
                # ell_play.click()
                time.sleep(3)
                aigei.rename_first_mp3_file_with_counter_and_timeout(r"C:\Users\Administrator\Downloads\动物声音 音效素材 免费下载 - 爱给网",title)
                print(f"进度{current_page}__{index+1}:{title}")
            aigei.click_element(next_loc)
            current_page+=1
        else:
            print("未输入go,退出")
    else:
        print("已经达到了最后一页,结束")
        break
aigei.keep_browser_open()

运行效果:

页面加载完成

请打开自动下载,完成后输入go:go

20

文件 C:\Users\Administrator\Downloads\动物声音 音效素材 免费下载 - 爱给网\森林鸟叫-吱吱-烘托气氛_1_1___1_8d9bd97c09eb43db80a535f7ca990495.mp3 已存在,尝试下一个序号...

进度1__1:森林鸟叫-吱吱-烘托气氛_1_1__

文件 C:\Users\Administrator\Downloads\动物声音 音效素材 免费下载 - 爱给网\奶牛叫声-哞-自然动物_1_2___1_e660bb38ca3e46e091b702bc31b417c2.mp3 已存在,尝试下一个序号...

进度1__2:奶牛叫声-哞-自然动物_1_2__

进度1__3:鸟叫声-叽叽叽-麻雀_1_3__

进度1__4:河流水声-自然环境-淅沥淅沥_1_4__

进度1__5:鸟拍打翅膀飞走-自然环境_1_5__

进度1__6:自然动物-青蛙叫声-呱呱呱_1_6__

进度1__7:自然鸟类早晨循环-户外_1_7__

进度1__8:自然天气-雨声-哗啦啦_1_8__

进度1__9:羊叫-咩-自然动物_1_9__

进度1__10:公鸡啼叫_1_10__

进度1__11:昆虫叫声-蟋蟀-啾啾啾_1_11__

进度1__12:翅膀缓缓扇动-鸟类_1_12__

进度1__13:自然环境鸟类农场早晨循环-户外_1_13__

进度1__14:鸟叫-唧唧-树林里的鸟叫_1_14__

进度1__15:蝉叫-吱吱-夏天树林_1_15__

进度1__16:马嘶 1_1_16__

进度1__17:夏天-自然环境音效-宁静的森林之声_1_17__

进度1__18:乌鸦叫 多 短-自然_1_18__

进度1__19:宁静的森林之声-自然环境-昆虫叫声_1_19__

进度1__20:翅膀拍打中号-鸟类_1_20__

20

进度2__1:城市环境-清晨居民区-日常环境_2_1__

进度2__2:农村鸟语狗吠声_2_2__

进度2__3:自然环境鸟在公园 01-户外_2_3__

进度2__4:寺庙-佛教目标-敲打木鱼_2_4__

进度2__5:小溪边的鸟-自然环境_2_5__

进度2__6:汪汪汪-狗叫-凶狠_2_6__

相关推荐
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar10 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805110 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_10 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机16 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机17 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机17 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i18 小时前
drf初步梳理
python·django
每日AI新事件18 小时前
python的异步函数
python