如何使用 Selenium 保存播放音频 Python

How to save playing audio with Selenium Python

我正在使用 IBM Watson 开发一个验证码求解器,一切正常,我只需要将播放的音频保存到一个文件中,然后可以使用 watson 解析该文件。我不知道该怎么做,我在这里找不到任何东西。如果可能的话,我不想要一些复杂的请求等,只需将播放的音频保存到一个文件中即可。或下载音频,但我尝试使用 chrome_options 设置下载位置,但它不起作用 任何帮助将不胜感激

我的代码:

import os
import time
import random
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from multiprocessing import Process
import ibm_watson
from ibm_watson import SpeechToTextV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
from ibm_watson.websocket import RecognizeCallback, AudioSource

chrome_options = Options()
chrome_options.add_argument("--mute-audio")
chrome_options.add_argument ("download.default_directory=/home/valentino/")
driver = webdriver.Chrome(options=chrome_options)

apikeywatson = 'C2f79A8ENbeUmWw-1DwTMd_v4IgCdCjqKpx21PsRaKan'
urlwatson = 'https://api.eu-de.speech-to-text.watson.cloud.ibm.com/instances/9a22253e-7fc5-4c67-b85b-5ad54db8282d'
authibm = IAMAuthenticator(apikeywatson)
stt = SpeechToTextV1(authenticator=authibm)
stt.set_service_url(urlwatson)

driver.get('https://client-demo.arkoselabs.com/github')
time.sleep(4)
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src^='https://client-api.arkoselabs.com/fc/gc/']")))
time.sleep(2)
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span[class='fc_meta_audio_btn']"))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "audio_play"))).click()

我相信我也经历过类似的情况。如果您的文件下载成功,但下载到默认目录,而不是您想要的目录,我会告诉您如何解决这个问题。

  1. 不要使用相对路径,尝试使用绝对路径:

    chrome_options.add_argument (f"download.default_directory={}/home/valentino/")

  2. 这可能行不通,请尝试用反斜杠替换正斜杠:

    chrome_options.add_argument (f"download.default_directory={}\home\valentino\")

  3. 如果这对您有用,那您就可以开始了。但这对我不起作用。我不得不通过手动将文件从下载的文件夹移动到我想要的文件夹来解决这个问题。你可以使用这样的东西:

    from shutil import move

    #verify this path as it varies from OS to OS
    default_file_download_path = 'C:\Users\UserName\Downloads\' 
    destination_path = 'home\valentino\'
    
    downloaded_file_name = [x for x in os.listdir(default_file_download_path)
                            if "audio_verification_challenge" in x][0]
    
    move(default_file_download_path+downloaded_file_name , destination_path+downloaded_file_name)

是的,最后一个选项可能看起来很丑陋,但这是我让它适用于我的用例的唯一方法。


更新

如果您仔细检查 HTML,它们会为每个音频文件提供一个不错的 SRC link。您需要使用简单的请求调用从该 SRC 检索文件,然后将其保存在本地。我相信这是最简单和最快的方法。

driver.get('https://client-demo.arkoselabs.com/github')
time.sleep(4)
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src^='https://client-api.arkoselabs.com/fc/gc/']")))

audio_src = driver.find_element_by_xpath('//audio[@preload="auto"]').get_attribute('src')
content = requests.get(audio_src).content
# save the content into a file where you would want to
open('your_desired_location\captcha_file.wav', 'wb').write(content)

如果您收到此错误 requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',)),那么您应该 header 请求。只需将 content = 行替换为类似内容(如 here 所述):

content = requests.get(audio_src,headers={
"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
}).content