@Nekech

Парсинг сайта Яндекс.Музыка на Python, как?

Здравствуйте! Стоит задача запарсить сайт яндекс.музыки
Нужно чтобы приходила ссылка на трек из чартов
Не очень понимаю как это можно сделать
В разделе поделиться треком нашел "Поделиться HTML кодом" . Там указана и ссылка на трек. Но я не понимаю как ее оттуда достать
Объясните пожалуйста как это сделать, или расскажите другой способ
(В самом HTML коде нет ссылки на трек)
  • Вопрос задан
  • 1826 просмотров
Пригласить эксперта
Ответы на вопрос 3
Vindicar
@Vindicar
RTFM!
Если сайт не слишком защищается от парсеров и не требует JS для работы:
requests для скачивания страницы, beautiful soup для разбора html документа и поиска элементов в нём.

Если сайт требует JS для работы, можно пошариться в консоли разработчика в браузере и найти, какие запросы страница-фронт делает, чтобы подгрузить данные. Тогда ты можешь научиться делать точно такие-же запросы, и получать данные сразу в машинночитаемом виде (часто в JSON).

Если сайт защищается от парсеров и JS логика слишком сложная, или он часто обновляется, можно попробовать selenium для эмуляции браузера. Дальше используешь инструменты selenium, чтобы найти интересующие тебя элементы на странице.

Если сайт детектит selenium, нужно искать сборки селениума, которые труднее обнаружить. Тут я навскидку не подскажу.
Ответ написан
Комментировать
@duff89
Вот реальный код, только что написан и проверен, защиты там нет:
import requests

headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,fi;q=0.6,nb;q=0.5,is;q=0.4,pt;q=0.3,ro;q=0.2,it;q=0.1,de;q=0.1',
    'Connection': 'keep-alive',
    'Referer': 'https://music.yandex.ru/chart',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'X-Current-UID': '403036463',
    'X-Requested-With': 'XMLHttpRequest',
    'X-Retpath-Y': 'https://music.yandex.ru/chart',
    'sec-ch-ua': '"Not?A_Brand";v="8", "Chromium";v="108", "Google Chrome";v="108"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
}

params = {
    'what': 'chart',
    'lang': 'ru',
    'external-domain': 'music.yandex.ru',
    'overembed': 'false',
    'ncrnd': '0.23800355071570123',
}
response = requests.get('https://music.yandex.ru/handlers/main.jsx', params=params, headers=headers)
chart = response.json()['chartPositions']
for track in chart:
    position = track['track']['chart']['position']
    title = track['track']['title']
    author = track['track']['artists'][0]['name']
    print(f"N-{position} - {title} - {author}")

Выход:
N-1 - ЗА ДЕНЬГИ ДА - INSTASAMKA
N-2 - Отключаю телефон - INSTASAMKA
N-3 - Komarovo - DVRST
N-4 - Кукла колдуна - Король и Шут
N-5 - Ножевой - A.V.G
N-6 - Лесник - Король и Шут
...
Ответ написан
Rodja
@Rodja
Из чарта топ 100


import requests
from bs4 import BeautifulSoup

# URL чарта "Топ 100"
url = 'https://music.yandex.ru/chart/top-100'

# Отправляем GET-запрос на страницу
response = requests.get(url)

# Создаем объект BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')

# Находим ссылку на первый трек в чарте
track_link = soup.find('a', class_='d-track__title-link')

# Получаем URL трека
track_url = track_link.get('href')

# Выводим URL трека
print(track_url)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы