前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬取网易云音乐每日推荐歌单,然后定时自动发送到朋友邮箱

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

作者头像
double
发布2022-01-26 13:54:43
1.6K0
发布2022-01-26 13:54:43
举报
文章被收录于专栏:算法channel

你好,我是 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的取值,如下图中的红框所示:

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

这是代码获取到的:

代码语言:javascript
复制
<RequestsCookieJar[<Cookie MUSIC_U=8e504c23c925ac6b1a9f8570bd5ea25899dcb9d14e06692fe82562bbf8998e10db7e765df03701e5d88f396e7092517fd69973145faab799d78b6050a17a35e7a47070bb71cca15c2d96587bb7c51858 for .music.163.com/>, <Cookie NMTID=00OfaG13kwU00MTt0ZEkt1FAzgBBlEAAAF-Bs4AAA for .music.163.com/>, <Cookie __csrf=13b3d714dab6aefe645de1f994416da6 for .music.163.com/>, <Cookie __remember_me=true for .music.163.com/>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/api/clientlog>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/api/clientlog>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/api/feedback>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/api/feedback>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/eapi/clientlog>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/eapi/clientlog>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/eapi/feedback>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/eapi/feedback>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/neapi/clientlog>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/neapi/clientlog>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/neapi/feedback>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/neapi/feedback>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/openapi/clientlog>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/openapi/clientlog>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/wapi/clientlog>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/wapi/clientlog>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/wapi/feedback>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/wapi/feedback>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/weapi/clientlog>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/weapi/clientlog>, <Cookie MUSIC_A_T=1446513182120 for .music.163.com/weapi/feedback>, <Cookie MUSIC_R_T=1446513246949 for .music.163.com/weapi/feedback>]>

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

代码语言:javascript
复制
re.findall('__csrf=(.*?) for', str(self.session.cookies))[0]

6 user-agent

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

下面进入到代码开发部分

环境安装

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

内置模块,如下:

代码语言:javascript
复制
import time
import re
import smtplib
from email import header
from email.mime import text, multipart
from threading import Timer

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

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

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

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

代码语言:javascript
复制
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请求的头,从浏览器里复制过来:

代码语言:javascript
复制
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是定时自动发送邮件的时间间隔,设置为一天,意思是每一天定时发送:

代码语言:javascript
复制
send_email_interval = 60*60*24

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

NetRcmndSong类

主方法是run

代码语言:javascript
复制
    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首歌:

代码语言:javascript
复制
【程序员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

代码语言:javascript
复制
    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代码得到的。

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

代码语言:javascript
复制
self.cracker.get(data)

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

cmd方法

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

代码语言:javascript
复制
@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

代码语言:javascript
复制
Timer(send_email_interval, cmd()).start()

测试

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

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

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

代码语言:javascript
复制
python p3_email_song.py -u 你的网易云账户 -p 你的网易密码

这是我收到的邮件截图:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境安装
  • 项目框架
  • NetRcmndSong类
  • cmd方法
  • 测试
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档