Pull to refresh

Скачиваем музыку из vk с помощью python

Всем, привет. Я люблю слушать музыку в ВК, так как малоизвестные группы обычно выкладывают свою музыку туда. Приложение, через которое я слушал бесплатно в фоне, почему-то перестало рабоать, и тогда решил скачать музыку на телефон. Тыкать в браузере очень долго, а светиться на сайтах, которые скачивают музыку, я не хотел. Пришла в голову идея скачать музыку с помощью питона. Через официальное API от ВК скачать музыку не выйдет, так как они отключили публичный API для аудио. Сначала был вариант парсить мобильную версию и тащить оттуда ссылки на песни, но я не умею парсить сайты, да и python отличается именно тем, что для любой задачи уже есть модуль. Собственно полазил в google нашел библиотеку vk_api. У нее как раз есть метод, который возвращает ссылки на песни.

Сначала импортируем нужные модули. Модуль time нужен, чтоб посмотреть за сколько скачивались ваши песни. Он не обязателен.

import vk_api
from vk_api import audio
import requests
from time import time
import os

Теперь добавим немного переменных. name_dir — имя папки, в которую скачаются песни (добавил, чтоб все аккуратно было), а path — путь, куда скачаются песни

REQUEST_STATUS_CODE = 200
name_dir = 'music_vk'
path = r'E:\python\course\music\\' + name_dir 
login = '___'  # Номер телефона
password = '___'  # Пароль
my_id = '____'  # Ваш id vk

Здесь создаем нашу папку name_dir, если ее нет.

if not os.path.exists(path):
    os.makedirs(path)

Теперь нам нужно авторизоваться и получить список песен.

vk_session = vk_api.VkApi(login=login, password=password)
vk_session.auth()
vk = vk_session.get_api()  # Теперь можно обращаться к методам API как к обычным 
                                        # классам
vk_audio = audio.VkAudio(vk_session)  # Получаем доступ к audio

Переходи в директорию, куда будем сохранять песни

os.chdir(path)

А вот и алгоритм, который скачивает песни и сохраняет их. vk_audio.get(owner_id=my_id) — возвращает список песен по переданному id. Итерируемся по этому списку, чтоб потом записать каждую песню в файл

time_start = time()
for i in vk_audio.get(owner_id=my_id):
    try:
        r = requests.get(i["url"])
        if r.status_code == REQUEST_STATUS_CODE:
            with open(i["artist"] + '_' + i["title"] + '.mp3', 'wb') as output_file:
                output_file.write(r.content)
    except OSError:
        print(i["artist"] + '_' + i["title"])
time_finish = time()
print("Time seconds:", time_finish - time_start)

У меня 1000 песен качались 600 секунд.
vk_audio.get(owner_id=my_id) — возвращает список. Список выглядит вот так:

[
  {
    "id": 456239850,
    "owner_id": Здесь будет переданный id,
    "url": "https://cs1-67v4.vkuseraudio.net/p9/d6e2cf63cf34b8.mp3?extra=KIpwmZ_N4DW8dxSL5waeW4LtuhKO_6Wjamf1xjc0kg7YT_iGXVtayuRtTU0tspSNAaMGKYqcmLluZXjdLqXifH-p2h83sCpo2yzN3fO2p9M1sOHpx0_X_abTKzVXO7Uwsf6YiZOWL1P5RQmSOZhY3GEz",
    "artist": "Lumen",
    "title": "Sid & Nancy",
    "duration": 247
  },
   ...
]

При скачивании песен возникла вот такая ошибка, не совсем понял что это. Мне кажется связано с названием песен. Разбираться было лень, поэтому я просто вывел название песен в консоль. Вот ошибка:

image

Требуемые модули: request, vk_api, BeautifulSoup4
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.