一、前言
很久没有写了,发现自己就算每一天都会练习代码,但是过了一段时间后仍然会有忘记的可能,所以尝试把这些练习过程记录一下。(版权不允许,所以说某狗,此代码仅供学习,版权不通过好几次了,我可不想进去)
二、实践
(一)导入所有需要的库
包已经都在这里了,导入库的过程以及库的用法网页上都有,自己搜。
import random
import re
import json
import time
import requests
from lxml import etree
from fake_useragent import UserAgent
from selenium import webdriver
import os
from selenium.webdriver.chrome.options import Options
(二)根据歌名返回搜索的所有歌名的列表
就是这个。
网页端的只有第一页,也就是前三十首,但是对于选择也足够了。
1、通过json数据来寻找这些歌名的数据。在此浏览界面按F12。点击Network,然后点击JS,然后刷新。就有这个:
有时候我也不知道该选哪个才能知道数据藏在哪里,具体在哪也是我一个个试的,要精确知道在哪还得等我学习完HTML语言基础才知道可能。
帮你们试完了,就是这个。然后寻找Heades,找到Request URL.
也就得到了你想要的json数据地址。就是这样的。(哎呀,不宝宝教学了,想学的就会懂,不懂再问我,有时间就回你。)
search_url = "https://songsearch.kugou.com/song_search_v2?callback=jQuery112405132987859127838_1550204317910&page" \
"=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_fil" \
"ter=0&_=1550204317912&keyword={}".format(song_name)
这个json数据长这样,根据歌名变成链接复制到浏览器是这样。
从中找到你想要的数据也挺难的,具体咋找的,硬找的。我这里是用下面这个正则表达式找的,json数据下载后。
headers = {
"UserAgent": self.ua.random
}
res = requests.get(search_url, headers=headers)
# print(res.text)
start = re.search("jQuery\d+_\d+\(?", res.text)
js = json.loads(res.text.strip().lstrip(start.group()).rstrip(")")) # 注意:末尾有一个换行需要去掉
song_list = js['data']['lists']
获取的内容是这里面的。什么歌名啊,歌手啊,他们在这个网站的信息都在这里面了,而我要的是FileHash和AlbumID这两个信息。
2、返回你想要的歌曲所在链接
标记处是我们需要的,在上面已经给求出来了。接下来看看怎么运作的,运作出来的是长什么样的。
默认选择第一首歌,则
想要下载歌曲链接获取成功。
3、获取音乐播放地址
接下来就轻松了,无脑webdriver驱动。
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
if not os.path.exists('./音乐'):
os.mkdir("音乐")
driver = webdriver.Chrome(options=chrome_options)
前面三行是隐藏驱动窗口的命令行。if语句是创建你电脑里创建下载的地址。这一块代码块在这。
def music_parse(self):
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
if not os.path.exists('./音乐'):
os.mkdir("音乐")
driver = webdriver.Chrome(options=chrome_options)
url = self.get_play_url()
driver.get(url=url)
data = driver.page_source # 获取网页源码
driver.quit()
tree = etree.HTML(data)
self.music = tree.xpath('//*[@class="music"]/@src')[0]
self.musicname = "./音乐/" + tree.xpath('//*[@class="audioName"]/@title')[0] + ".mp3"
print("获取音乐下载地址成功!")
return self.music, self.musicname
播放地址长这样:(后面跟个.mp3的链接)
https://webfs.ali.kugou.com/202204051941/be3f5a3be0820ccfec92f12b3b916918/KGTX/CLTX001/5abb66a6dc60b0bc34deb0ad1ff986f9.mp3
4、下载音乐
先放代码块:
def music_download(self):
headers = {"User-Agent": UserAgent().random}
music, musicname = self.music_parse()
response = requests.get(url=music, headers=headers).content # 这个是最主要主要的
print("请稍等,下载歌曲中...")
time.sleep(random.random() * 2)
with open(musicname, "wb")as fp:
fp.write(response)
print("下载完成")
print("下载地址为:", os.getcwd() + '\音乐')
里面的函数我自己就造了两个,其他都自己搜。这一块没什么讲的,很简单的下载。
5、总程序如下:(直接运行就行,默认下载的歌曲为第一个,也可自行更改)
import random
import re
import json
import time
import requests
from lxml import etree
from fake_useragent import UserAgent
from selenium import webdriver
import os
from selenium.webdriver.chrome.options import Options
class Crawl_KuGou_Music:
'''
根据名称进行搜索并下载。
'''
def __init__(self, song_name, num=1):
self.song_name = song_name
self.num = num
self.ua = UserAgent()
def get_play_url(self):
search_url = "https://songsearch.kugou.com/song_search_v2?callback=jQuery112405132987859127838_1550204317910&page" \
"=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_fil" \
"ter=0&_=1550204317912&keyword={}".format(self.song_name)
headers = {
"UserAgent": self.ua.random
}
res = requests.get(search_url, headers=headers)
# print(res.text)
start = re.search("jQuery\d+_\d+\(?", res.text)
js = json.loads(res.text.strip().lstrip(start.group()).rstrip(")"))
song_list = js['data']['lists']
file_hash = song_list[self.num - 1]['FileHash']
AlbumID = song_list[self.num - 1]['AlbumID']
self.hash_url = f"https://www.kugou.com/song/#hash={file_hash}&album_id={AlbumID}"
Names = []
for i in range(len(song_list)):
name = str(song_list[i]['FileName']).replace('<em>', '').replace('</em>', '')
print(str(i + 1) + ">>>" + name)
Names.append(name)
print('=' * 50)
print(f'返回第{self.num}首歌 《{Names[self.num - 1]}》的播放链接:')
print(self.hash_url)
time.sleep(random.random() * 2)
return self.hash_url
def music_parse(self):
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
if not os.path.exists('./音乐'):
os.mkdir("音乐")
driver = webdriver.Chrome(options=chrome_options)
url = self.get_play_url()
driver.get(url=url)
data = wb.page_source # 获取网页源码
driver.quit()
tree = etree.HTML(data)
self.music = tree.xpath('//*[@class="music"]/@src')[0]
self.musicname = "./音乐/" + tree.xpath('//*[@class="audioName"]/@title')[0] + ".mp3"
print("获取音乐下载地址成功!")
return self.music, self.musicname
def music_download(self):
headers = {"User-Agent": UserAgent().random}
music, musicname = self.music_parse()
response = requests.get(url=music, headers=headers).content
print("请稍等,下载歌曲中...")
time.sleep(random.random() * 2)
with open(musicname, "wb")as fp:
fp.write(response)
print("下载完成")
print("下载地址为:", os.getcwd() + '\音乐')
if __name__ == '__main__':
song_name = input("请输入您想要搜索的歌曲名称:")
KC = Crawl_KuGou_Music(song_name, num=1)
# KC.get_play_url()
# a, b = KC.music_parse()
KC.music_download()
(三)效果展示
我接下来还有MV的下载操作和多线程运用,代码编好了,以后再写。
三、总结
没什么好总结的,写一下最近令我震撼,也是能够激励现在我的一首诗,你们应该没感觉。
我看见红色,
不是嫁衣的艳红,或鲜血的鲜红
红是当你提及某人,热切生动的灵魂
红是第几百次转身,擦肩而过的停顿
红是拥抱时,旁人不得而知的体温
红是用一个吻,获得的首肯
红是你明知虚幻,却觉世间童话迷人
红是旁人嘲笑,你扔迷信的一生
红色是停止的一瞬,是谁的一瞬