你好,我是 zhenguo
这是我的第493篇原创
今天是我的第三个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 Headers
的cookie
键中能够找到csrf_token
的取值,如下图中的红框所示:
与代码实际获取的稍有出路:
这是代码获取到的:
<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>]>
以代码为准,使用正则提取:
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
其中,time
和re
模块都很常见。后面三行smtplib
和email
都与自动发邮件相关。
下面这几个包是重点,其中第一个包是公众号朋友皮卡丘编写,用于模拟自动登入常见各大平台,用起来很方便。
第二个包也是皮卡丘编写,用于自动爬取网易云音乐。我看了其中的主要模块,编写的很不错。
第三个包是用来写命令行接口,很方便。
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
模块装饰的命令行接口:
主方法是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代码,再学习RSA
和AES
的加密技术,相信理解没问题。
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 你的网易密码
这是我收到的邮件截图:
本文分享自 程序员郭震zhenguo 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!