记得要手动登录一次,即可。
使用时间 过多时,有验证码?但不确定出现时间,所以在程序段中无法加入。等有机会时加入即可。哪怕是手工。
完整代码:
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__