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

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

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

完整代码:

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__

相关推荐
Ajiang2824735304几秒前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
幽兰的天空5 分钟前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
runing_an_min6 分钟前
ffmpeg视频滤镜:提取缩略图-framestep
ffmpeg·音视频·framestep
小曲曲1 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书3 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
佑华硬盘拷贝机4 小时前
音频档案批量拷贝:专业SD拷贝机解决方案
音视频
EasyNVR4 小时前
NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案
安全·音视频·监控·视频监控
----云烟----5 小时前
QT中QString类的各种使用
开发语言·qt