Question:
I’m trying to create a program that scrapes a website that downloads music from soundcloud with selenium, and I have it all figured out excpet for one thing: whenever it gets past searching on the search bar, this happens:
An error occurred: Message:
Stacktrace:
#0 0x59ff2e6a1b33 <unknown>
#1 0x59ff2e16a6d8 <unknown>
#2 0x59ff2e1a06f1 <unknown>
#3 0x59ff2e1a08b1 <unknown>
#4 0x59ff2e1d3574 <unknown>
#5 0x59ff2e1be08d <unknown>
#6 0x59ff2e1d12fb <unknown>
#7 0x59ff2e1bdf53 <unknown>
#8 0x59ff2e193a0a <unknown>
#9 0x59ff2e194ad5 <unknown>
#10 0x59ff2e6d32fd <unknown>
#11 0x59ff2e6ec4bb <unknown>
#12 0x59ff2e6d50d5 <unknown>
#13 0x59ff2e6ed145 <unknown>
#14 0x59ff2e6c8aaf <unknown>
#15 0x59ff2e709ba8 <unknown>
#16 0x59ff2e709d28 <unknown>
#17 0x59ff2e72448d <unknown>
#18 0x74e923630d40 <unknown>
Program:
from seleniumhandler import *
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException, ElementNotInteractableException
import time
import shutil
import os
def safe_click(driver, locator):
try:
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(locator))
element.click()
except StaleElementReferenceException:
element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(locator))
element.click()
except ElementNotInteractableException:
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(locator))
driver.execute_script("arguments[0].scrollIntoView(true);", element)
element.click()
def safe_send_keys(driver, locator, keys):
try:
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(locator))
element.send_keys(keys)
except StaleElementReferenceException:
element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(locator))
element.send_keys(keys)
except ElementNotInteractableException:
js = "arguments[0].scrollIntoView(true);"
driver.execute_script(js, element)
element.send_keys(keys)
url = input("Enter the URL: ")
driver = new_driver()
driver.maximize_window()
driver.get("https://soundcloudmp3.cc/")
# Corrected XPath selector for the search bar
search_bar_locator = (By.XPATH, "//input[@name='videoURL']")
# Send URL to the search bar
safe_send_keys(driver, search_bar_locator, url)
safe_send_keys(driver, search_bar_locator, Keys.RETURN)
# Wait for the page to load results
driver.implicitly_wait(10)
try:
results = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "li.track-item"))
)
for result in results:
try:
# Re-locate the elements before interacting with them
dropdown_toggle_locator = (By.CSS_SELECTOR, "a.dropdown-toggle")
safe_click(driver, dropdown_toggle_locator)
dropdown_items_locator = (By.CSS_SELECTOR, "ul.dropdown-menu li")
dropdown_items = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located(dropdown_items_locator)
)
selected_item = None
for item in dropdown_items:
if ".mp3 (320kb)" in item.text:
selected_item = item
break
elif ".mp3 (256kb)" in item.text:
selected_item = item
break
elif ".mp3 (128kb)" in item.text:
selected_item = item
break
elif ".wav" in item.text:
selected_item = item
break
else:
selected_item = item # Fallback to .flac if no other formats found
if selected_item:
safe_click(driver, (By.XPATH, f"//li[text()='{selected_item.text}']"))
time.sleep(15)
# Re-enter the URL after each download
search_bar_locator = (By.XPATH, "//input[@name='videoURL']")
safe_click(driver, search_bar_locator)
search_bar = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(search_bar_locator)
)
search_bar.clear() # Clear the input before entering the URL again
safe_send_keys(driver, search_bar_locator, url)
safe_send_keys(driver, search_bar_locator, Keys.RETURN)
driver.implicitly_wait(10)
except Exception as e:
print(f"An error occurred: {e}")
continue
finally:
driver.quit()
I was expecting it to download the file with my code, but as described it doesn’t.