爬取网易云音乐每日推荐歌单,然后定时自动发送到朋友邮箱

Python与算法社区

共 3797字,需浏览 8分钟

 ·

2022-01-02 15:41

点击上方蓝色字体,关注程序员zhenguo


你好,我是 zhenguo
这是我的第493篇原创
今天是我的第三个Python项目:每天自动定时、自动发送爬取的网易云音乐的推荐歌单到你的邮箱列表中。
前两个项目:
我的第一个Python实用项目,来了!
我的第二个Python趣味项目,来了!
因为年底了工作忙,只能抽取每天碎片时间,这个项目我前前后后加起来准备了近一周,希望真正帮助到你。
下面1-6是爬虫的前端基本操作,我言简意赅的表述如下:

1 打开网址

https://music.163.com/

2 点击 发现音乐--推荐

3 在此网页,右键,按下检查

4 点击 Network

5 在第一个红框内输入:recommand 过滤得到API

进而找到推荐歌曲的API:

https://music.163.com/weapi/discovery/recommend/resource?csrf_token=

且是POST请求

并且在Request Headerscookie键中能够找到csrf_token的取值,如下图中的红框所示:

与代码实际获取的稍有出路:

这是代码获取到的:

8e504c23c925ac6b1a9f8570bd5ea25899dcb9d14e06692fe82562bbf8998e10db7e765df03701e5d88f396e7092517fd69973145faab799d78b6050a17a35e7a47070bb71cca15c2d96587bb7c51858 for .music.163.com/>, 00OfaG13kwU00MTt0ZEkt1FAzgBBlEAAAF-Bs4AAA for .music.163.com/>, 13b3d714dab6aefe645de1f994416da6 for .music.163.com/>, for .music.163.com/>, 1446513182120 for .music.163.com/api/clientlog>, 1446513246949 for .music.163.com/api/clientlog>, 1446513182120 for .music.163.com/api/feedback>, 1446513246949 for .music.163.com/api/feedback>, 1446513182120 for .music.163.com/eapi/clientlog>, 1446513246949 for .music.163.com/eapi/clientlog>, 1446513182120 for .music.163.com/eapi/feedback>, 1446513246949 for .music.163.com/eapi/feedback>, 1446513182120 for .music.163.com/neapi/clientlog>, 1446513246949 for .music.163.com/neapi/clientlog>, 1446513182120 for .music.163.com/neapi/feedback>, 1446513246949 for .music.163.com/neapi/feedback>, 1446513182120 for .music.163.com/openapi/clientlog>, 1446513246949 for .music.163.com/openapi/clientlog>, 1446513182120 for .music.163.com/wapi/clientlog>, 1446513246949 for .music.163.com/wapi/clientlog>, 1446513182120 for .music.163.com/wapi/feedback>, 1446513246949 for .music.163.com/wapi/feedback>, 1446513182120 for .music.163.com/weapi/clientlog>, 1446513246949 for .music.163.com/weapi/clientlog>, 1446513182120 for .music.163.com/weapi/feedback>, 1446513246949 for .music.163.com/weapi/feedback>]>

以代码为准,使用正则提取:

re.findall('__csrf=(.*?) for', str(self.session.cookies))[0]

6 user-agent

也是在Request Headers部分中,可以获取到:

下面进入到代码开发部分

环境安装

定时、自动爬取网易今日推荐歌单,并自动发送邮件。

内置模块,如下:

import time
import re
import smtplib
from email import header
from email.mime import text, multipart
from threading import Timer

其中,timere模块都很常见。后面三行smtplibemail都与自动发邮件相关。

下面这几个包是重点,其中第一个包是公众号朋友皮卡丘编写,用于模拟自动登入常见各大平台,用起来很方便。

第二个包也是皮卡丘编写,用于自动爬取网易云音乐。我看了其中的主要模块,编写的很不错。

第三个包是用来写命令行接口,很方便。

from DecryptLogin import login
from DecryptLogin.core.music163 import Cracker
import click

项目框架

首先,看下项目文件,主要包括以下两个:

p3_email_song.py

song_email.txt

其中,py为代码模块,txt为py模块需要读入的邮箱列表,表示爬取后自动发给这些邮箱。

下面,看下py模块的主要类和函数。

如上提到的,全局变量headers字典是post请求的头,从浏览器里复制过来:

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

接下来,全局变量send_email_interval是定时自动发送邮件的时间间隔,设置为一天,意思是每一天定时发送:

send_email_interval = 60*60*24

主要包括一个类:NetRcmndSong,用于自动爬取网易云音乐的推荐歌单,cmd函数是使用click模块装饰的命令行接口:

NetRcmndSong类

主方法是run

    def run(self):
        recommend_info = self.__get_recommend()
        keys, values = list(recommend_info.keys()), list(recommend_info.values())
        self.title = f'【程序员zhenguo】和网易云音乐今日为你({self.username})推荐的歌曲如下:'
        options = [v for v in values]
        self.email_content = self.title + "\n" + '\n'.join(options) + "\n\n\t来自你的老朋友\n\t程序员zhenguo"
        print(self.email_content)
        
        self.__send_email()

self.__get_recommend()用于爬取歌单数据,后面解析成邮件发送的格式,这是我今天爬取的推荐歌单,一共74首,下面是前20首歌:

【程序员zhenguo】和网易云音乐今日为你(guozhennianhua@163.com)推荐的歌曲如下:
0 梦一场-小叶同学
1 Something Just Like This-We Rabbitz
2 侧脸-于果
3 我们的时光-赵雷
4 余生浮梁-侃侃
5 第三极-十月时Sunset
6 无感-王朝
7 逆流时光-安图声乐队
8 多幸运遇见你-李乐乐
9 夢に向かって-中村由利子
10 直到遇见了你,我只喜欢你-陈柯宇
11 万万里-史超
12 Forrest Gump-David Metis
13 董小姐(小调版)-张超洋
14 Sứ Thanh Hoa(Remix)-SHENMING
15 一生中最爱 (Live)-李克勤
16 Tojana-Willyam Wiay
17 一言难尽-张宇
18 你-刘健宗
19 求佛南方凯-白风流
20 我曾-杨骑瑞

 来自你的老朋友
 程序员zhenguo

__get_recommend是整个项目的核心,通过文章一开始的讲解,我们知道API是下面的url

    def __get_recommend(self):
        """
        获得每日歌曲推荐
        :return:
        """

        url = 'http://music.163.com/weapi/v2/discovery/recommend/songs?csrf_token='
        data = {
            'crsf_token': self.csrf,
            'limit''999',
            'offset''0',
            'total''true'
        }
        data = self.cracker.get(data)
        response = self.session.post(url, headers=self.headers, data=data)
        response_json = response.json()

你一定会好奇:data的结构为啥是这样,这是通过解析网易云前端的js代码得到的。

最重量级的、最核心的应该是下面这行代码:

self.cracker.get(data)

这里面都有源码,大家可以结合网易云前端的js代码,再学习RSAAES的加密技术,相信理解没问题。

cmd方法

click模块封装命令行接口是真的方便,只需要使用下面三个装饰器:

@click.command()
@click.option('-u', help='用户名')
@click.option('-p', help='密码')
def cmd(u, p):
    client = NetRcmndSong(u, p)
    client.run()
    Timer(send_email_interval, cmd).start()

另外,应为我们想每天定时自动发送,所以使用Timer做定时任务。只需要下面一行代码,还是有点巧妙,cmd函数必须包括下面这行代码,同时Timer的参数也必须叫cmd

Timer(send_email_interval, cmd()).start()

测试

下面应用上面的模块,实现定时、自动爬取并发送邮件。

song_email.txt文件中配置接收推荐音乐的邮箱,一行一个,可以给你女朋友、好朋友、家人的邮箱都写上。

然后在cmd或terminal窗口,只需输入下面一行代码:

python p3_email_song.py -u 你的网易云账户 -p 你的网易密码

这是我收到的邮件截图:

完整代码下载

上面完整py代码文件,在我的公众号后台回复:c,即可下载

同时过往或后面的Python项目代码,我也会同步到这个文件夹中。

长按关注,回复c

不用打赏,点个赞或在看

就心满意足了

zhenguo原创精华PDF,倾情奉献给你,后台回复对应关键词下载
  Python专题 | 数据分析手册 | 算法刷题100
浏览 129
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报