30/09/2018, 23:01

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

Bài liên quan
0