美文网首页
利用python来爬取喜爱歌手的音乐并发到邮箱2020-05-1

利用python来爬取喜爱歌手的音乐并发到邮箱2020-05-1

作者: python小哥哥2020 | 来源:发表于2020-05-16 17:56 被阅读0次

==============================================================
大家好,我是天空之城。俗话说得好,音乐是激发人类创造力最好的帮手。相信大家在每天繁忙的工作之后,都想听首音乐放松一下身心吧,在放松的同时说不定还会蹦出一些工作上的新想法呢。那么如何利用python这个人类好帮手,来帮助我们及时获取所关注的歌手的歌曲信息呢?今天教大家撰写一个python小程序,可以及时爬取qq音乐上歌手的歌名,专辑名称,时间长度,以及音乐链接,以及发送到邮箱。整个程序分为三部分,第一部分是获取所有歌名,专辑名称,时间长度,以及音乐链接数据,用到的是requests和BeautifulSoup模块以及json模块解析数据。
==============================================================

def getdata():
    name = input('请输入歌手名字:')
    for x in range(5):
        params = {
            'ct': '24',
            'qqmusic_ver': '1298',
            'new_json': '1',
            'remoteplace': 'sizer.yqq.song_next',
            'searchid': '64405487069162918',
            't': '0',
            'aggr': '1',
            'cr': '1',
            'catZhida': '1',
            'lossless': '0',
            'flag_qc': '0',
            'p': str(x + 1),
            'n': '20',
            'w': name,
            'g_tk': '5381',
            'loginUin': '0',
            'hostUin': '0',
            'format': 'json',
            'inCharset': 'utf8',
            'outCharset': 'utf-8',
            'notice': '0',
            'platform': 'yqq.json',
            'needNewCode': '0'
        }

        res_music = requests.get(url, params=params,headers=headers)
        json_music = res_music.json()
        list_music = json_music['data']['song']['list']
        for music in list_music:
            name = music['name']
            album = music['album']['name']
            time = str(music['interval'])
            link = 'https://y.qq.com/n/yqq/song/' + music['file']['media_mid'] + '.html\n\n'
            list_all.append(name + '\n' + album + '\n' + time+'s' + '\n' + link )
    return '\n\n'.join(list_all)

==============================================================
* 过程比较简单,经过分析网页源代码发现歌曲信息并不在里面,于是需要到network下面的xhr里面去寻找,直接ctrl+F发现数据隐藏在了client-search-cp这个请求里面,接着在query string parametersl里面发现了params参数,其中w=歌手名,p代表页数。下面直接requests获得网页数据,然后用json模块进行解析数据,添加了params参数,是方便我们修改歌手名字,也就是我们可以手动输入自己喜欢的歌手名字来获取歌曲信息,这里为了减轻服务器的压力只获取了5页的数据,不要给别人服务器带来太大的压力哦。json数据格式经过解析res_music.json()之后,通过字典的键的三次取值json_music['data']['song']['list']来到了列表list_music里面,接着通过遍历列表for music in list_music:,分别取得了name = music['name'],album = music['album']['name'],time = str(music['interval']),link = 'https://y.qq.com/n/yqq/song/' + music['file']['media_mid'] + '.html\n\n'四个数据,我们把这四个数据放进新建的list_all下面,然后通过字符串拼接返回给函数return '\n\n'.join(list_all)。经过这样一番操作,我们就是拿到了这些数据。
接下来就是发送邮件模块的撰写,这里使用的qq邮箱的smtp功能,需要大家去邮箱获得授权码。
*
==============================================================

def send_email(list):
    mailhost = 'smtp.qq.com'
    qqmail = smtplib.SMTP()
    qqmail.connect(mailhost, 25)
    qqmail.login(account, password)
    content = '亲爱的,今天的推荐歌曲是:' + list
    message = MIMEText(content, 'plain', 'utf-8')
    subject = '今日推荐'
    message['Subject'] = Header(subject, 'utf-8')
    try:
        qqmail.sendmail(account, receiver, message.as_string())
        print('邮件发送成功')
    except:
        print('邮件发送失败')
    qqmail.quit()

==============================================================
大家注意看,这里是要把getdata()函数返回值作为一个字符串来传参到这个发送邮件程序send_email(list)里的,一定要是字符串格式,如果是列表或者字典格式,是无法传参并发送邮件的。发送邮件的主要部分包括确定邮箱服务器mailhost = 'smtp.qq.com',传输协议qqmail = smtplib.SMTP(),连接邮箱并登陆qqmail.connect(mailhost, 25),qqmail.login(account, password),写入邮箱主内容content里面有参数list,这个list其实就是getdata函数里面获得数据,后面就是try发送邮件qqmail.sendmail(account, receiver, message.as_string()),如果发送成功了就打印成功,好了第二部分也写好了。
第三部分就是调用主程序了。

==============================================================

if __name__ == '__main__':
    account = input('请输入你的邮箱:')
    password = input('请输入你的邮箱密码:')
    receiver = input('请输入收件人:')
    mess = getdata()
    send_email(mess)

==============================================================
首先分别输入发件人邮箱和密码,这个密码是需要到qq邮箱去获得smtp授权码的,后面分别执行第一个获取数据程序mess = getdata()和第二个发送邮件程序send_email(mess)。下面是完整的代码。
==============================================================

import requests
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
from email.header import Header


headers = {
      'Referer': 'https://movie.douban.com/top250?start=1&filter=',
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:46.0) Gecko/20100101 Firefox/46.0'}
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'

list_all=[]

def getdata():
    name = input('请输入歌手名字:')
    for x in range(5):
        params = {
            'ct': '24',
            'qqmusic_ver': '1298',
            'new_json': '1',
            'remoteplace': 'sizer.yqq.song_next',
            'searchid': '64405487069162918',
            't': '0',
            'aggr': '1',
            'cr': '1',
            'catZhida': '1',
            'lossless': '0',
            'flag_qc': '0',
            'p': str(x + 1),
            'n': '20',
            'w': name,
            'g_tk': '5381',
            'loginUin': '0',
            'hostUin': '0',
            'format': 'json',
            'inCharset': 'utf8',
            'outCharset': 'utf-8',
            'notice': '0',
            'platform': 'yqq.json',
            'needNewCode': '0'
        }

        res_music = requests.get(url, params=params,headers=headers)
        json_music = res_music.json()
        list_music = json_music['data']['song']['list']
        for music in list_music:
            name = music['name']
            album = music['album']['name']
            time = str(music['interval'])
            link = 'https://y.qq.com/n/yqq/song/' + music['file']['media_mid'] + '.html\n\n'
            list_all.append(name + '\n' + album + '\n' + time+'s' + '\n' + link )
    return '\n\n'.join(list_all)

def send_email(list):
    mailhost = 'smtp.qq.com'
    qqmail = smtplib.SMTP()
    qqmail.connect(mailhost, 25)
    qqmail.login(account, password)
    content = '亲爱的,今天的推荐歌曲是:' + list
    message = MIMEText(content, 'plain', 'utf-8')
    subject = '今日推荐'
    message['Subject'] = Header(subject, 'utf-8')
    try:
        qqmail.sendmail(account, receiver, message.as_string())
        print('邮件发送成功')
    except:
        print('邮件发送失败')
    qqmail.quit()

if __name__ == '__main__':
    account = input('请输入你的邮箱:')
    password = input('请输入你的邮箱密码:')
    receiver = input('请输入收件人:')
    mess = getdata()
    send_email(mess)

==============================================================
好了,大家如果感兴趣,可以去尝试一下哦(转载请注明原作者)!python是人类的好帮手,科技改变未来。如果大家有兴趣学习python可以联系我。
=============================================================

相关文章

网友评论

      本文标题:利用python来爬取喜爱歌手的音乐并发到邮箱2020-05-1

      本文链接:https://www.haomeiwen.com/subject/zvjrohtx.html