Tải nhạc từ mp3.zing.vn bằng Python (Download file.mp3 from mp3.zing.vn by using Python)

Một buổi chiều mưa không rơi, thằng bạn đưa cho mình một cái link mà nhờ đó ta có thể lấy được source file.mp3 của mp3.zing.vn.


Như các bạn thấy, bài nhạc này không thể tải về (download) vì lí do bản quyền.
Chúng ta bắt đầu vọc source code thôi :)
Đầu tiên các bạn Ctrl + U để mở có thể view-source


Tiếp đến, các bạn sử dụng Ctrl + F và gõ "data-xml" (Vì mình đã tìm trước nên biết được thứ chúng ta cần nằm ở đâu)


"data-xml" và thêm cả "get-source", mọi thứ rõ ràng thế nhỉ?. Và bây giờ cái thằng bạn mình đưa mình mới là hữu ích. Mình sẽ lấy cái phần sau "get-source/" đó là "ZmJHyLnNCvZbhJvtLbJyFHLH" và nối nó vào với thứ mà thằng bạn đã đưa mình "http://mp3.zing.vn/xml/song-xml/". "http://mp3.zing.vn/xml/song-xml/ZmJHyLnNCvZbhJvtLbJyFHLH" Úm ba la...


Có lẽ gần tới đích rồi. Và cái chúng ta cần là? Là source


Là thứ này đây. Let's check it out!


Awesome. Giờ chúng ta có thể Ctrl + S để Save về.





Chất lượng tuyệt vời.
Vậy là các bạn đã biết mình lấy source file rồi. Giờ chúng ta làm một cái script để việc này bớt thủ công hơn nào.
Đầu tiên là chúng ta cần đó là link bài hát. Mình sẽ lấy nó bằng cách sử dụng argv luôn, khỏi rườm rà nhập input.
from sys import argv
standardLenArgv = 2 # một là tên của script, hai là link
if len(argv) == standardLenArgv: # nếu đúng thì chúng ta tiếp tục
    oriLink = argv[1]
else: # không thì chúng ta thông báo cho user về việc sai command
    print("run script by command:\n\
        ==> python getLinkZingMp3.py linkOfSong")
    exit()
Chúng ta cần source HTML của link
import requests
requestLink = requests.get(oriLink)
HTMLLink = requestLink.text
Sau khi có được source HTML rồi thì phải làm gì đó để tìm tới chỗ data_xml và lấy được cái chúng ta cần. Đây chính là lúc Regular Expression phát huy sức mạnh

import re # import regular expression
regexData_xml_get_source = r'data-xml="\/json\/song\/get-source\/\w+"'
data_xml_get_source = re.search(regexData_xml_get_source, HTMLLink)
if data_xml_get_source is not None: # Nếu tìm được data_xml
    data_xml = data_xml_get_source.group()
    data_xml = dataxml.rstrip('"') # bỏ đi '"'
    sourceID = data_xml.split('/')[-1] # chúng ta chỉ lấy cái ID thôi
else: # trường hợp không tìm thấy, chúng ta thông báo cho user và exit
    print('Cannot find the {}'.format("'data_xml'")
    exit()
Sau khi có được sourceID, chúng ta sẽ làm link XML
linkXML = 'http://mp3.zing.vn/xml/song-xml/' + sourceID
Tiếp đến lại lấy sourceHTML để có được link file source
requestXML = requests.get(linkXML)
HTMLXML = requestXML.text # lấy source HTML
regexSource = r'http:\/\/zmp3-mp3-s1-tr\.zadn\.vn\/.+\/.+\?key=.+&expires=\d+' # build một cái regex
matchSource = re.search(regexSource, HTMLXML) # tìm kiếm link file
if matchSource is not None: # nếu tìm được
    linkSource = matchSource.group()
else:
    print('Cannot find {}'.format("'Link Source'"))
    exit()
Có được link file rồi thì việc download về rất đơn giản

import urllib.request
urllib.request.urlretrieve(linkSource, filenameToSave)
Ở chỗ filenameToSave, các bạn có thể kêu người dùng nhập vào, hoặc dùng cách như chúng ta lấy link. Còn mình thì lấy luôn bằng cách lấy từ title

regexTitle = r'<title>.+\|'
matchTitle = re.search(regexTitle, HTMLLink)
if matchTitle is not None:
    filenameToSave = matchTitle.group().rstrip(' |').replace('<title>', '') + '.mp3'
else: # nếu không thể lấy được thì chúng ta tự set default name.
    filenameToSave = 'Unknowed.mp3'
    # Nếu bạn sợ trùng file 'Unknowed.mp3' thì các bạn có thể lấy Unknowed + một số random
Thế là xong các phần, việc còn lại chỉ là sắp xếp lại các thứ theo trình tự thôi. Chúc các bạn may mắn. Tham khảo code của mình: Github
Follow: Twitter
Cám ơn các bạn đã đọc.

Nhận xét

Popular Posts

Namedtuple trong Python (Namedtuple in Python)