闲暇时间筛选一些网易云歌曲(Python)

刚开始思路

刚开始是想做一个找寻热门歌曲列表的一个列表文件夹,查找条件就是去爬取网易云官网的各种排行榜,查看评论数,比较评论数,筛选出比较热门的总榜,或者一定评论数以上的歌单榜,然后再遍历榜内歌曲,爬取评论数以及热门评论来进行热门歌曲列表的制作,很多时候我们都在手动查找一些最近最新最热的歌曲,来闲暇时间放松一下,制作这样一个小工具会方便我们查找,不至于大范围筛选,也算是学以致用吧。

话不多说,着手做

因为要访问很多网址,封装成一个函数返回

做这个需要频繁访问不同的网址,所以优先封装一个函数来统一处理,在这里插入图片描述它网页给我们显示的网址全是这种带#号的,这个根本访问不到内容,获取不到数据,在这里插入图片描述我们打开开发者工具,点network,刷新,点toplist这个块,发现我们需要的第一批数据就在这里,我们点开Headers,在这里插入图片描述可以看见这个是通过get请求发送的并没有什么复杂的处理,此时,我们在它上方看见了它真正的URL,通过这个URL,再把header一起传过去处理一下就能获取到我们需要的内容,初步获得了我们需要的热歌歌单榜,以及他们的评论数。



def paihang(soup):
    date = soup.find("div",{"class":"g-bd3 g-bd3-1 f-cb"})
    data = date.find_all("ul",{"class":"f-cb"})
    for tr in data:
        ltd = tr.find_all("li")
        if len(ltd)==0:
            continue
        for td in ltd:
            pylists=[]
            name = td.find("p",{"class":"name"}).a.text
            pylists.append(name)
            savecsv(pylists)
            lists.append(td.attrs["data-res-id"])

    
  

这里是获取各个榜单名字和访问他们所需URL的函数。

通过榜单歌单URL获取每个榜单内的歌曲的URL

我们首先还是来分析找到我们需要的内容在哪里,打开在这里插入图片描述打开开发者工具,通过指向工具找到我们需要的歌曲,发现他给了我们一个song?id,我们查看进入一首歌的网址发现带#的为假URL但是真的URL只是把#去掉在这里插入图片描述
在这里插入图片描述
所以我们进行大胆尝试,果然通过得到song?id拼接能够进入到某一首歌的页面,
下面是获取歌曲名字和简单保存的方法。


def resou(soup,st):
    pylists=[]
    data = soup.find('ul',{'class':'f-hide'})
    dov = data.find_all('a')
    ht =soup.find('span',{'id':'comment-count'}).text
    coment = soup.find('span',{'class':'ico u-icn u-icn-74 s-fc10'})
    for cm in coment:
        print(cm)
    hr = int(ht)
    pylists.append(ht)
    savecsv(pylists)
    print(hr)
    print(st)
    if hr>st:
        for td in dov:
            print(td.text)
            list=[]
            musicUrl='http://music.163.com/song/media/outer/url'+td['href'][5:]+'.mp3'
            musicName=td.text
            # 单首歌曲的名字和地址放在list列表中
            list.append(musicName)
            list.append(musicUrl)
            # 全部歌曲信息放在mlists列表中
            mlists.append(list)
            


进入歌曲页面然后想获取单首歌曲的页面信息,就GG了

首先我们还是选一首歌曲来分析一波我们需要的数据在哪里,在这里插入图片描述,找了半天发现他在这个文件里,感觉好像要结束了,在这里插入图片描述

然后我们去找他的URL请求头在这里插入图片描述
一看,post请求,token传数据,试着访问了一下,发现根本获取不到数据,果断请问了一下百度君,[详情请访问原贴(https://www.cnblogs.com/lyrichu/p/6635798.html)感谢lyrichu提供的帮助,可以看到又是json解析,又是解码,对于我这样的完全看不明白,打算按照他的来访问一波,于是去安装一波解码库,死活装不上,然后又去其他贴看哈,说是不知道解码方式只能碰运气试试能不能把token里面的两个参数解析出来,就止步于此了,于是就对前面的榜单歌单数据进行了数据分析处理,后面又更好的方法再继续对单首歌曲处理。

通过获取到的数据,用pyecharts库制作了图形在这里插入图片描述

通过筛选大于你需求评论数的榜单歌单下载歌单里的歌曲,下载的歌曲在当前目录的music文件夹里面在这里插入图片描述
在这里插入图片描述
附上整个最后完成的代码,

import requests
import re
import os
from bs4 import BeautifulSoup
from pyecharts import Bar
import urllib.request
lists=[]
mlists=[]
pylists=[]
headers = {
    'Referer':'http://music.163.com/',
    'Host':'music.163.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    }

def getHtmltext(url):
    try:
        r = requests.get(url,headers = headers).content
        return r
    except:
        return ""
def savecsv(content):
    with open("F:/zhongbaocai/Python/img/1.csv","a") as f:
        f.write("".join(content)+"\n")

def paihang(soup):
    #pylists=[]
    date = soup.find("div",{"class":"g-bd3 g-bd3-1 f-cb"})
    data = date.find_all("ul",{"class":"f-cb"})
    for tr in data:
        ltd = tr.find_all("li")
        if len(ltd)==0:
            continue
        for td in ltd:
            pylists=[]
            name = td.find("p",{"class":"name"}).a.text
            pylists.append(name)
            #savecsv(pylists)
            #with open("F:/zhongbaocai/Python/img/1.txt","a") as f:
                #f.write(name+"\n")
            lists.append(td.attrs["data-res-id"])

def resou(soup,st):
    #pylists=[]
    data = soup.find('ul',{'class':'f-hide'})
    dov = data.find_all('a')
    ht =soup.find('span',{'id':'comment-count'}).text
    coment = soup.find('span',{'class':'ico u-icn u-icn-74 s-fc10'})
    hr = int(ht)
    pylists.append(ht)
    #savecsv(pylists)
    print(hr)
    print(st)
    if hr>st:
        for td in dov:
            print(td.text)
            list=[]
            musicUrl='http://music.163.com/song/media/outer/url'+td['href'][5:]+'.mp3'
            musicName=td.text
            # 单首歌曲的名字和地址放在list列表中
            list.append(musicName)
            list.append(musicUrl)
            # 全部歌曲信息放在mlists列表中
            mlists.append(list)

def maketurtle():
    bar =Bar("网易云", "热评数")
    name=[]
    i=26
    with open("F:/zhongbaocai/Python/img/1.csv","r") as f:
        for td in f:
            name.append(td)
    bar.add("热榜", [name[0], name[1], name[2], name[3], name[4],name[5],
                 name[6], name[7], name[8], name[9], name[10],name[11],
                 name[12], name[13], name[14], name[15], name[16],name[17],
                 name[18], name[19], name[20], name[21], name[22],name[23],
                 name[24], name[25],name[26]],
                [0, name[1+i], name[2+i], name[3+i], name[4+i],name[5+i],
                 name[6+i], name[7+i], name[8+i], name[9+i], name[10+i],name[11+i],
                 name[12+i], name[13+i], name[14+i], name[15+i], name[16+i],name[17+i],
                 name[18+i], name[19+i], name[20+i], name[21+i], name[22+i],name[23+i],
                 name[24+i], name[25+i],name[26+i]])
    bar.render()
            
def main():
    ura = "https://music.163.com/discover/toplist"
    html = getHtmltext(ura)
    soup = BeautifulSoup(html,"lxml")
    paihang(soup)
    st = eval(input("请输入你对评论数的最低需求:"))
    for i in lists:
        urb = ura+"?id="+str(i)
        #print(urb)
        atml = getHtmltext(urb)
        aoup = BeautifulSoup(atml,"lxml")
        resou(aoup,st)
        path=os.path.abspath('.')
    
    for i in mlists:
        url=i[1]
        name=i[0]
        try:
            print('正在下载',name)
            if not os.path.exists(path+"/{}".format("music")):
                os.mkdir(path+"/{}".format("music"))
            urllib.request.urlretrieve(url,'./music/%s.mp3'% name)
            print('下载成功')
        except:
            print('下载失败')
    savecsv(pylists)
    maketurtle()

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值