爬取某DogMusic——selenium.webdriver的使用

一、前言

        很久没有写了,发现自己就算每一天都会练习代码,但是过了一段时间后仍然会有忘记的可能,所以尝试把这些练习过程记录一下。(版权不允许,所以说某狗,此代码仅供学习,版权不通过好几次了,我可不想进去)

二、实践

(一)导入所有需要的库

包已经都在这里了,导入库的过程以及库的用法网页上都有,自己搜。

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的下载操作和多线程运用,代码编好了,以后再写。

三、总结

        没什么好总结的,写一下最近令我震撼,也是能够激励现在我的一首诗,你们应该没感觉。

我看见红色,

不是嫁衣的艳红,或鲜血的鲜红

红是当你提及某人,热切生动的灵魂

红是第几百次转身,擦肩而过的停顿

红是拥抱时,旁人不得而知的体温

红是用一个吻,获得的首肯

红是你明知虚幻,却觉世间童话迷人

红是旁人嘲笑,你扔迷信的一生

红色是停止的一瞬,是谁的一瞬

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值