Tham khảo - Chương trình tải album từng trang tải nhạc Zing Mp3
Mình đang làm đồ án cần phải thu thập dữ liệu nhạc nên mình có viết một đoạn chương trình nhỏ để tải 1 toàn bộ bài hát trong 1 album của Zing mp3 về. Nếu bạn nào cần có thể lấy về sử dụng ^^. Đoạn code mình viết chỉ để xài 1 lần nên nó không hoàn thiện lắm, mong mọi người thông cảm
Cách sử dụng: Copy đoạn code ở dưới và lưu vào một file, chẳng hạn như zing_album_downloader.py
.
Để chạy chương trình cần gọi trong command line với cú pháp sau:
>python zing_album_downloader.py 'album_url' 'directory'
Trong đó:
-
url
là đường dẫn của album có http, ví dụ http://mp3.zing.vn/album/100-Ca-Khuc-Au-My-Hay-Nhat-Moi-Thoi-Dai-Various-Artists/ZWZ9ABU8.html -
directory
là thư mục con để lưu file.
Ví dụ:
>python zing_album_downloader.py 'http://mp3.zing.vn/album/100-Ca-Khuc-Au-My-Hay-Nhat-Moi-Thoi-Dai-Various-Artists/ZWZ9ABU8.html' 'album'
Chương trình có thể tải song song MAX_THREADS files cùng lúc, nếu muốn tăng hoặc giảm có thể thay đổi trực tiếp trong code.
Mình đang làm đồ án cần phải thu thập dữ liệu nhạc nên mình có viết một đoạn chương trình nhỏ để tải 1 toàn bộ bài hát trong 1 album của Zing mp3 về. Nếu bạn nào cần có thể lấy về sử dụng ^^. Đoạn code mình viết chỉ để xài 1 lần nên nó không hoàn thiện lắm, mong mọi người thông cảm
Cách sử dụng: Copy đoạn code ở dưới và lưu vào một file, chẳng hạn như zing_album_downloader.py
.
Để chạy chương trình cần gọi trong command line với cú pháp sau:
>python zing_album_downloader.py 'album_url' 'directory'
Trong đó:
-
url
là đường dẫn của album có http, ví dụ http://mp3.zing.vn/album/100-Ca-Khuc-Au-My-Hay-Nhat-Moi-Thoi-Dai-Various-Artists/ZWZ9ABU8.html -
directory
là thư mục con để lưu file.
Ví dụ:
>python zing_album_downloader.py 'http://mp3.zing.vn/album/100-Ca-Khuc-Au-My-Hay-Nhat-Moi-Thoi-Dai-Various-Artists/ZWZ9ABU8.html' 'album'
Chương trình có thể tải song song MAX_THREADS files cùng lúc, nếu muốn tăng hoặc giảm có thể thay đổi trực tiếp trong code.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import os
import sys
import threading
PLAYER_ID = 'html5player'
CURRENT_PATH = os.getcwd()
MAX_THREADS = 10
threadLimiter = threading.BoundedSemaphore(MAX_THREADS)
class SongDownloaderThread(threading.Thread):
def __init__(self, song_url, file_dir, song_name):
super(SongDownloaderThread, self).__init__()
self.url = song_url
self.file_dir = file_dir
self.song_name = song_name
def download_song(self):
response = requests.get(self.url, stream=True)
if not response.ok:
raise Exception('blabla', 'bloblo')
return response
def save_song(self, data):
with open(self.file_dir, 'wb') as handle:
#write to file
for block in data.iter_content(8192):
handle.write(block)
def run(self):
threadLimiter.acquire()
try:
data = self.download_song()
self.save_song(data)
print 'Download completed song: ', self.song_name.encode('utf-8')
except Exception as e:
print e
print 'Download error song: ', self.song_name.encode('utf-8')
finally:
threadLimiter.release()
def get_song_list(url):
#get album's page html
html_text = requests.get(url).text
#Extract url for getting album info
soup = BeautifulSoup(html_text, "html.parser")
div = soup.find('div', id=PLAYER_ID)
api_url = div['data-xml']
api_url = api_url.replace('xml', 'html5xml', 1)
#Download album info
album_info = requests.get(api_url).json()
return album_info['data']
def download_songs(song_list, save_dir):
print "Prepare to download " + str(len(song_list)) + " songs"
directory = CURRENT_PATH + ' + save_dir
if not os.path.exists(directory):
os.makedirs(directory)
for idx, song in enumerate(song_list):
song_url = song['source_base'] +'/'+ song['source_list'][0]
file_dir = os.path.join(directory, song['name'] + '.mp3')
thread = SongDownloaderThread(song_url, file_dir, song['name'])
thread.start()
def main(argv):
if (len(argv) != 3):
print "Arguments does not match requirement.
"
print "Example: download_zing_album.py 'url' 'save_directory'"
else:
url = argv[1]
directory = argv[2]
try:
song_list = get_song_list(url)
print 'Download album info completed!'
except:
print 'Download album info error!'
return
download_songs(song_list, directory)
if __name__ == "__main__":
main(sys.argv)
P/s: Code chỉ mang tính tham khảo không lợi dụng để sử dụng vào mục đích thương mại hay vi phạm bản quyền