Загрузка данных


import time
import json
import traceback
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import DesiredCapabilities


def define_driver():
    driver_path = 'C:\\Users\\Rana\\.wdm\\drivers\\chromedriver\\win64\\119.0.6045.124\\chromedriver-win32/chromedriver.exe'
    capabilities = DesiredCapabilities.CHROME
    capabilities["goog:loggingPrefs"] = {"performance": "ALL"}

    options = Options()
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    options.add_argument('--no-sandbox')
    options.add_argument("--headless")

    s = Service(driver_path)
    driver = webdriver.Chrome(service=s, desired_capabilities=capabilities, options=options)
    return driver


def get_downloadUrl(driver, track_url):
    for _ in range(5):

        downloadUrl = None

        try:
            driver.get(track_url)
        except:
            driver.get(track_url)

        # wait for the XHR requests to complete
        WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '//*[@class="userBadge__title" or contains(text(),"This track was not found")]')))
        time.sleep(1)

        not_found = len(driver.find_elements(By.XPATH, '//*[contains(text(),"This track was not found")]')) != 0
        if not_found:
            return False

        for i in range(100):
            logs_raw = driver.get_log("performance")
            logs = [json.loads(lr["message"])["message"] for lr in logs_raw]
            xhr_logs = [log for log in logs if "Network.responseReceived" in log["method"]]
            if xhr_logs:
                break
            time.sleep(0.1)

        for log in xhr_logs:
            try:
                request_id = log["params"]["requestId"]
                resp_url = log["params"]["response"]["url"]
                if "https://cf-hls-media.sndcdn.com/media/" in resp_url:
                    downloadUrl = resp_url
                    return downloadUrl
            except:
                pass

    return downloadUrl


def get_response(track_url):
    driver = define_driver()
    downloadUrl = get_downloadUrl(driver, track_url)

    # If tracks Not found
    if not downloadUrl:
        output_json = {
            'status': False,
            'reason': 'This track was not found. Maybe it has been removed',
            'trackLink': track_url,
        }
        driver.quit()
        return output_json


    try:
        userName = driver.find_element(By.CSS_SELECTOR, '[class="userBadge__title"]').text.split('\n')[0]
    except:
        time.sleep(1)
        try:
            userName = driver.find_element(By.CSS_SELECTOR, '[class="userBadge__title"]').text.split('\n')[0]
        except:
            # print(traceback.format_exc())
            userName = None

    try:
        userFollowerCount = \
        driver.find_element(By.CSS_SELECTOR, '[title*="follower"]').get_attribute('title').split(' ')[0].replace(',',
                                                                                                                 '')
        userFollowerCount = int(userFollowerCount)
    except:
        # print(traceback.format_exc())
        userFollowerCount = None

    try:
        userTracksCount = driver.find_element(By.CSS_SELECTOR, '[title*="tracks"]').get_attribute('title').split(' ')[
            0].replace(',', '')
        userTracksCount = int(userTracksCount)
    except:
        # print(traceback.format_exc())
        userTracksCount = None

    try:
        userVerified = len(driver.find_elements(By.CSS_SELECTOR, '[title="Verified"]')) == 1
    except:
        # print(traceback.format_exc())
        userVerified = None

    try:
        title = driver.find_element(By.CSS_SELECTOR, 'h1[class*="soundTitle__title"]').text
    except:
        # print(traceback.format_exc())
        title = None

    try:
        likesCount = driver.find_element(By.CSS_SELECTOR, '[title*="like"]').get_attribute("title").replace(" likes",
                                                                                                            '').replace(
            " like", '').replace(",", '')
        likesCount = int(likesCount)
    except:
        # print(traceback.format_exc())
        likesCount = None

    try:
        playsCount = driver.find_element(By.CSS_SELECTOR, '[title*="play"]').get_attribute("title").replace(" plays",
                                                                                                            '').replace(
            " play", '').replace(",", '')
        playsCount = int(playsCount)
    except:
        # print(traceback.format_exc())
        playsCount = None

    try:
        repostsCount = driver.find_element(By.CSS_SELECTOR, '[title*="repost"]').get_attribute("title").replace(
            " reposts", '').replace(" repost", '').replace(",", '')
        repostsCount = int(repostsCount)
    except:
        # print(traceback.format_exc())
        repostsCount = None

    try:
        commentsCount = driver.find_element(By.CSS_SELECTOR, 'span[class="commentsList__actualTitle"]').text.replace(
            " comments", '').replace(" comment", '').replace(",", '')
        commentsCount = int(commentsCount)
    except:
        # print(traceback.format_exc())
        commentsCount = None

    # print('userName:', userName)
    # print('userFollowerCount:', userFollowerCount)
    # print('userTracksCount:', userTracksCount)
    # print('userVerified:', userVerified)
    # print('title:', title)
    # print('likesCount:', likesCount)
    # print('playsCount:', playsCount)
    # print('repostsCount:', repostsCount)
    # print('commentsCount:', commentsCount)
    # print('downloadUrl:', downloadUrl)

    driver.quit()

    output_json = {
        'status': True,
        'userName': userName,
        'userFollowerCount': userFollowerCount,
        'userTracksCount': userTracksCount,
        'userVerified': userVerified,
        'title': title,
        'likesCount': likesCount,
        'playsCount': playsCount,
        'repostsCount': repostsCount,
        'commentsCount': commentsCount,
        'downloadUrl': downloadUrl,
        'trackLink': track_url,
    }

    return output_json


if __name__ == '__main__':
    track_url = "https://soundcloud.com/whethan/lock-it-up"
    output_json = get_response(track_url)
    print(output_json)