爬取網(wǎng)易云音樂(lè)每日推薦歌單,然后定時(shí)自動(dòng)發(fā)送到朋友郵箱
點(diǎn)擊上方藍(lán)色字體,關(guān)注程序員zhenguo

1 打開(kāi)網(wǎng)址
https://music.163.com/
2 點(diǎn)擊 發(fā)現(xiàn)音樂(lè)--推薦

3 在此網(wǎng)頁(yè),右鍵,按下檢查
4 點(diǎn)擊 Network

5 在第一個(gè)紅框內(nèi)輸入:recommand 過(guò)濾得到API

進(jìn)而找到推薦歌曲的API:
https://music.163.com/weapi/discovery/recommend/resource?csrf_token=
且是POST請(qǐng)求

并且在Request Headers的cookie鍵中能夠找到csrf_token的取值,如下圖中的紅框所示:

與代碼實(shí)際獲取的稍有出路:
這是代碼獲取到的:
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>]>
以代碼為準(zhǔn),使用正則提?。?/p>
re.findall('__csrf=(.*?)?for',?str(self.session.cookies))[0]
6 user-agent
也是在Request Headers部分中,可以獲取到:

環(huán)境安裝
定時(shí)、自動(dòng)爬取網(wǎng)易今日推薦歌單,并自動(dòng)發(fā)送郵件。
內(nèi)置模塊,如下:
import?time
import?re
import?smtplib
from?email?import?header
from?email.mime?import?text,?multipart
from?threading?import?Timer
其中,time和re模塊都很常見(jiàn)。后面三行smtplib和email都與自動(dòng)發(fā)郵件相關(guān)。
下面這幾個(gè)包是重點(diǎn),其中第一個(gè)包是公眾號(hào)朋友皮卡丘編寫(xiě),用于模擬自動(dòng)登入常見(jiàn)各大平臺(tái),用起來(lái)很方便。
第二個(gè)包也是皮卡丘編寫(xiě),用于自動(dòng)爬取網(wǎng)易云音樂(lè)。我看了其中的主要模塊,編寫(xiě)的很不錯(cuò)。
第三個(gè)包是用來(lái)寫(xiě)命令行接口,很方便。
from?DecryptLogin?import?login
from?DecryptLogin.core.music163?import?Cracker
import?click
項(xiàng)目框架
首先,看下項(xiàng)目文件,主要包括以下兩個(gè):
p3_email_song.py
song_email.txt
其中,py為代碼模塊,txt為py模塊需要讀入的郵箱列表,表示爬取后自動(dòng)發(fā)給這些郵箱。
下面,看下py模塊的主要類(lèi)和函數(shù)。
如上提到的,全局變量headers字典是post請(qǐng)求的頭,從瀏覽器里復(fù)制過(guò)來(lái):
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':?'*/*'
}
接下來(lái),全局變量send_email_interval是定時(shí)自動(dòng)發(fā)送郵件的時(shí)間間隔,設(shè)置為一天,意思是每一天定時(shí)發(fā)送:
send_email_interval?=?60*60*24
主要包括一個(gè)類(lèi):NetRcmndSong,用于自動(dòng)爬取網(wǎng)易云音樂(lè)的推薦歌單,cmd函數(shù)是使用click模塊裝飾的命令行接口:

NetRcmndSong類(lèi)
主方法是run:
????def?run(self):
????????recommend_info?=?self.__get_recommend()
????????keys,?values?=?list(recommend_info.keys()),?list(recommend_info.values())
????????self.title?=?f'【程序員zhenguo】和網(wǎng)易云音樂(lè)今日為你({self.username})推薦的歌曲如下:'
????????options?=?[v?for?v?in?values]
????????self.email_content?=?self.title?+?"\n"?+?'\n'.join(options)?+?"\n\n\t來(lái)自你的老朋友\n\t程序員zhenguo"
????????print(self.email_content)
????????
????????self.__send_email()
self.__get_recommend()用于爬取歌單數(shù)據(jù),后面解析成郵件發(fā)送的格式,這是我今天爬取的推薦歌單,一共74首,下面是前20首歌:
【程序員zhenguo】和網(wǎng)易云音樂(lè)今日為你([email protected])推薦的歌曲如下:
0?夢(mèng)一場(chǎng)-小葉同學(xué)
1?Something?Just?Like?This-We?Rabbitz
2?側(cè)臉-于果
3?我們的時(shí)光-趙雷
4?余生浮梁-侃侃
5?第三極-十月時(shí)Sunset
6?無(wú)感-王朝
7?逆流時(shí)光-安圖聲樂(lè)隊(duì)
8?多幸運(yùn)遇見(jiàn)你-李樂(lè)樂(lè)
9?夢(mèng)に向かって-中村由利子
10?直到遇見(jiàn)了你,我只喜歡你-陳柯宇
11?萬(wàn)萬(wàn)里-史超
12?Forrest?Gump-David?Metis
13?董小姐(小調(diào)版)-張超洋
14?S??Thanh?Hoa(Remix)-SHENMING
15?一生中最?lèi)?ài)?(Live)-李克勤
16?Tojana-Willyam?Wiay
17?一言難盡-張宇
18?你-劉健宗
19?求佛南方凱-白風(fēng)流
20?我曾-楊騎瑞
?來(lái)自你的老朋友
?程序員zhenguo
__get_recommend是整個(gè)項(xiàng)目的核心,通過(guò)文章一開(kāi)始的講解,我們知道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()
你一定會(huì)好奇:data的結(jié)構(gòu)為啥是這樣,這是通過(guò)解析網(wǎng)易云前端的js代碼得到的。
最重量級(jí)的、最核心的應(yīng)該是下面這行代碼:
self.cracker.get(data)
這里面都有源碼,大家可以結(jié)合網(wǎng)易云前端的js代碼,再學(xué)習(xí)RSA和AES的加密技術(shù),相信理解沒(méi)問(wèn)題。
cmd方法
click模塊封裝命令行接口是真的方便,只需要使用下面三個(gè)裝飾器:
@click.command()
@click.option('-u',?help='用戶(hù)名')
@click.option('-p',?help='密碼')
def?cmd(u,?p):
????client?=?NetRcmndSong(u,?p)
????client.run()
????Timer(send_email_interval,?cmd).start()
另外,應(yīng)為我們想每天定時(shí)自動(dòng)發(fā)送,所以使用Timer做定時(shí)任務(wù)。只需要下面一行代碼,還是有點(diǎn)巧妙,cmd函數(shù)必須包括下面這行代碼,同時(shí)Timer的參數(shù)也必須叫cmd:
Timer(send_email_interval,?cmd()).start()
測(cè)試
下面應(yīng)用上面的模塊,實(shí)現(xiàn)定時(shí)、自動(dòng)爬取并發(fā)送郵件。
在song_email.txt文件中配置接收推薦音樂(lè)的郵箱,一行一個(gè),可以給你女朋友、好朋友、家人的郵箱都寫(xiě)上。
然后在cmd或terminal窗口,只需輸入下面一行代碼:
python?p3_email_song.py?-u?你的網(wǎng)易云賬戶(hù)?-p?你的網(wǎng)易密碼
這是我收到的郵件截圖:

完整代碼下載
上面完整py代碼文件,在我的公眾號(hào)后臺(tái)回復(fù):c,即可下載
同時(shí)過(guò)往或后面的Python項(xiàng)目代碼,我也會(huì)同步到這個(gè)文件夾中。
不用打賞,點(diǎn)個(gè)贊或在看
就心滿意足了
對(duì)應(yīng)關(guān)鍵詞下載