刚开始思路
刚开始是想做一个找寻热门歌曲列表的一个列表文件夹,查找条件就是去爬取网易云官网的各种排行榜,查看评论数,比较评论数,筛选出比较热门的总榜,或者一定评论数以上的歌单榜,然后再遍历榜内歌曲,爬取评论数以及热门评论来进行热门歌曲列表的制作,很多时候我们都在手动查找一些最近最新最热的歌曲,来闲暇时间放松一下,制作这样一个小工具会方便我们查找,不至于大范围筛选,也算是学以致用吧。
话不多说,着手做
做这个需要频繁访问不同的网址,所以优先封装一个函数来统一处理,它网页给我们显示的网址全是这种带#号的,这个根本访问不到内容,获取不到数据,我们打开开发者工具,点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()