网易云音乐-飙升榜歌曲信息爬取

此方法仅用于学习,请勿他用,造成爬取对象服务器压力

【目标】爬取网易云音乐榜单歌曲,返回 ['歌曲名','歌曲id','歌曲链接','榜单排名','歌曲信息(歌词,作词,编曲,歌手)','歌曲时长']

image.png

给出完整脚本及一些关键点的分析(个人拙见,若理解有误,请予以指正,谢谢)

1. 引入需要用到的库,并设置请求头Header及文件存储路径

import json 
import re 
import time
import datetime
tday=datetime.datetime.now().strftime('%Y-%m-%d')

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}

save_path='E:/python/scarpy/screapy_wyy/wyy_toplist_'+tday+'.csv'

2.定义函数:主要用于获取榜单歌曲名,歌曲链接及歌曲id(歌曲id用于后边构建歌曲链接获取歌曲信息)

(1)右键-检查,小鼠标定位到要提取的内容下,可以看到链接及歌曲名所在的标签,可以先尝试通过request.get()获取链接的respon.text(响应文本),看看所需要的信息是否能被打印出来,如果可以,则说明信息存储在html中,可以通过BeautifulSoup进行解析

image.png

(2)通过遍历a标签,返回的内容不唯一,需要找到最小的父类标签,在这个问题上纠结了很久,最后在框架的源代码(非网页源代码)中搜索歌曲名,发现了父类标签 <u1> class=f-hide

image.png
def get_toplist():
    url='http://music.163.com/discover/toplist'
    res=requests.get(url,headers=headers)
    toplist_soup=BeautifulSoup(res.text,'html.parser')
    music_list=toplist_soup.find('ul',class_="f-hide").find_all('a')
    song_msg=[]
    count=1
    for item in music_list:
        songname=item.text
        link='http://music.163.com'+item['href']
        p1=re.compile(r'id=(.*)',re.S)#提取规则,re.S是为了让.表示除了换行符的任一字符
        songid=re.findall(p1,item['href'])[0]#findall返回一个列表,但是此次结果中只有一个字符串,所以直接取[0]
        num=count
        song_msg.append([songname,songid,link,num])
        count+=1
    return song_msg 

3.定义函数:通过歌单id构造歌曲访问链接,通过requst.get进行读取解析(参考了网易云api文档构建的链接,因为原始的请求方式是post,需要从 【from data】中拼接参数,但参数通过函数进行了加密,有兴趣可以看下这位大佬的分析:https://blog.csdn.net/weixin_43999566/article/details/87697962,而我只能选择曲线救国)

(1) post请求 + 令人绝望的参数☟

image.png

(2) 内容存储在json中

image.png

所以最终的实现方式是根据api文档+获取到的歌单id,重构访问的链接

def get_toplist_songmsg():
    songlist=get_toplist()
    songlist_msg=[]
    listname=['歌曲名','歌曲id','歌曲链接','榜单排名','歌曲信息','歌曲时长']
    write_csv(listname)

    for songs in songlist:
        songid=songs[1]
        url='https://api.imjad.cn/cloudmusic/?type=lyric&id='+songid
        res=requests.get(url,headers=headers)
        res.encoding='utf-8'
        rst_dict=json.loads(res.text)#json格式字符串转成字典 
        print(rst_dict)
        try:
            lyrics=rst_dict['lrc']['lyric']
            #通过正则去掉[时间]及获取歌曲时长
            regex=re.compile(r'\[.*\]')#获取时间部分的信息
            final_lyric=re.sub(regex,'',lyrics)#把符合正则部分的内容替换成空
            final_lyric = re.sub(r'\n+', '|', final_lyric)#将歌曲歌词换行符换成“|”
            if len(re.findall(regex,lyrics))==0:
                song_time='none'
            else:
                song_time=re.findall(regex,lyrics)[-1]#获取歌曲信息最后一部分的时长作为歌曲整体时长
            songs.extend([final_lyric,song_time])
            songlist_msg.append(songs)
            print(songs)
            write_csv(songs)
            print('第%s首歌曲写入成功'%(str(songs[3])))
        except (TypeError,KeyError):
            print('获取不到')
        time.sleep(1.5)
    return songlist_msg

4.保存爬取的结果

注意点,由于编码问题,写入歌曲信息时会报UnicodeEncodeError,python3中使用的解决办法是对打开的文件设定编码格式为'gb18030'

#写入文件 
def write_csv(list_msg):
    import csv
    
    with open(save_path,'a',newline='',encoding ='gb18030') as csv_file:
        writer=csv.writer(csv_file)
        writer.writerow(list_msg)

5.发送邮件 (参考菜鸟教程:https://www.runoob.com/python/python-email.html)

注意点:附件名称为中文名时,需要使用add_header,否则会被编译成以.bin结尾的文件名:

image.png
def send_mail():
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.header import Header 
    
    #配置信息服务器+端口
    host='smtp.qq.com'
    port=25
    #获取发件人,授权码,收件人等信息
    account=input('请输入你的邮箱:')
    password=input('请输入邮箱授权码:')
    receiver=[]
    while True:
        addr=input('请输入收件箱:')
        receiver.append(addr)
        key=input('是否继续输入邮箱,按任意键继续,按"n"退出:')
        if key=='n':
            break 

    # 创建带附件的实例
    message=MIMEMultipart()
    message['From']=Header('莫得灵魂的小白','utf-8')
    message['To']=Header(','.join(receiver))
    text='自动获取【%s】榜单'%(str(tday))
    subject = text
    message['Subject'] = Header(subject, 'utf-8')

    #邮件正文内容
    message.attach(MIMEText('打开附件嗷', 'plain', 'utf-8'))

    # 构造附件:传送指定目录下的文件
    att1 = MIMEText(open(save_path, 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    file_name=text+'.csv'
    att1.add_header('Content-Disposition', 'attachment', filename=file_name)
    #att1["Content-Disposition"] = 'attachment,filename=%s' % file_name.encode("utf-8")
    message.attach(att1)

    #发送邮件
    smtp_mail=smtplib.SMTP()
    try:
        smtp_mail.connect(host,port)
        smtp_mail.login(account,password)
        smtp_mail.sendmail(account,receiver,message.as_string())
        smtp_mail.quit()
        print('发送成功')
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")

6. 调用函数执行

#执行

get_toplist_songmsg()
send_mail()

执行结果

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容