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

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

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

完整代码:

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__

相关推荐
秃头佛爷3 分钟前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨4 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
深度学习lover1 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
API快乐传递者2 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
阡之尘埃4 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控