1.實驗內容:從QQ音樂中獲取某個你喜歡的歌手的歌手清單。
詳細內容:輸出QQ音樂的歌曲清單,從QQ音樂中取得某個你喜歡的歌手的歌手清單。
例如:小紅莓的歌曲清單。

目標是獲取QQ音樂某位歌手的單曲清單,主要涉及到的庫有:requests、json.(為什么用到json后續進行解答。)
2.實驗步驟:
2.1.首先要了解QQ音樂網站的robots協議(安全)
發現只是禁止了播放列表,所以項目獲取歌單可操作。
2.2.打開QQ音樂網頁,查看頁面詳情,了解頁面。
進入QQ音樂主頁並輸入任意的歌手。例如:搜索林俊傑。打開審查元素(快捷鍵為Ctrl+Shift+I),界面操作為:更多工具-->開發者工具


2.3.分析網頁源代碼Elements
發現無歌曲信息,無法使用BeautifulSoup,顯示結果為空。為json類型需要引入json庫進行獲取內容。點擊Network,查看數據是否在XHR,分析Name,查看Preview.發現數據在XHR中,查看Preview發現信息如下:

2.4.點擊Headers,拿到相關的參數。


2.5.根據實際情況編寫合適的代碼進行實驗操作
引用json庫,添加fake_useragent包,基本實現指定歌手的查詢,並將歌手的歌曲呈現出來。從網頁源代碼中獲取重要信息如下:
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w={}'
headers = {
'User-Agent': ua.random,
'cookie':'RK=LdWlHMsQ+b; ptcz=42785168e679b66b7913e09a4387fc94c5ad2d81419840eb33a502abc14ae6c6; pgv_pvid=4366402929; fqm_pvqid=ed1a5c76-5778-4d72-aa4f-389d94cd126e; ts_uid=886687551; fqm_sessionid=2b4a4a2f-b921-4e70-861d-54a608695f10; pgv_info=ssid=s5047316408; ts_refer=www.so.com/link; _qpsvr_localtk=0.49574447171587144; login_type=1; wxopenid=; tmeLoginType=2; psrf_qqaccess_token=D40E8A445E33FC38FB47291B44C03E96; qqmusic_key=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_access_token_expiresAt=1656146941; psrf_qqunionid=93ABF9072A8734C330E108787CC182AE; uin=2363310076; wxunionid=; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_musickey_createtime=1648370941; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_qqopenid=900C2C2A46F36818FEB00C24A5EEC6B0; wxrefresh_token=; psrf_qqrefresh_token=8289BF671C8907272471F03D564F5A69; euin=owosoio5oenl7c**; ts_last=y.qq.com/n/ryqq/search',
'referer':'https://y.qq.com/'
}
簡易版本以CSV形式呈現爬取結果,完整代碼如下:
import requests # 請求 from fake_useragent import UserAgent import json print("請輸入您想要爬取清單的歌手名:") name = input() ua = UserAgent() headers = { 'User-Agent': ua.random, 'cookie':'RK=LdWlHMsQ+b; ptcz=42785168e679b66b7913e09a4387fc94c5ad2d81419840eb33a502abc14ae6c6; pgv_pvid=4366402929; fqm_pvqid=ed1a5c76-5778-4d72-aa4f-389d94cd126e; ts_uid=886687551; fqm_sessionid=2b4a4a2f-b921-4e70-861d-54a608695f10; pgv_info=ssid=s5047316408; ts_refer=www.so.com/link; _qpsvr_localtk=0.49574447171587144; login_type=1; wxopenid=; tmeLoginType=2; psrf_qqaccess_token=D40E8A445E33FC38FB47291B44C03E96; qqmusic_key=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_access_token_expiresAt=1656146941; psrf_qqunionid=93ABF9072A8734C330E108787CC182AE; uin=2363310076; wxunionid=; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_musickey_createtime=1648370941; qm_keyst=Q_H_L_5Opuh_YbF8NbIlG-FqC_2ns2gXyWSTh_cplWyZPhEpyIWDVtQUGLwQQ; psrf_qqopenid=900C2C2A46F36818FEB00C24A5EEC6B0; wxrefresh_token=; psrf_qqrefresh_token=8289BF671C8907272471F03D564F5A69; euin=owosoio5oenl7c**; ts_last=y.qq.com/n/ryqq/search', 'referer':'https://y.qq.com/' } url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=10&w={}' resp = requests.get(url.format(name), headers=headers) json_str = resp.text json_str = json_str[9:-1] json_dict = json.loads(json_str) songlist = json_dict['data']['song']['list'] f = open("list.csv", mode="w", encoding="utf-8") for song in songlist: print(song['albumname']) f.write(song['albumname']) f.write('\n')
2.6.通過代碼進行演示運行結果
以周深為例:

3.實驗分析:
(1)實驗前要明確目標,本次是獲取QQ音樂的某位歌手的歌單。熟悉網頁->分析目標(策略:url格式(范圍)、數據格式、網頁編碼)->編寫代碼->執行代碼。
(2)網頁的源碼中,所有歌曲信息都在類名為mod_songlist的div浮層里面,類名為songlist_list的無序列表ul下,每個子元素li展示一個單曲,類名為songlist__album下的a標簽,包含單曲的鏈接,名稱和時長等。
(3)url鏈接管理器,采用集合數據結構來保存單曲鏈接,使用集合是因為多個單曲可能來自同一專輯(專輯網址一樣),這樣可以減少請求次數。這也是結果中歌曲呈現有重復,原因是來自於同一專輯,顯示重復的其實是來自的專輯名稱。
(4)json的理解:json 是用字符串的樣式書寫的列表或數組(也可以是列表和數組的嵌套)。json 是另一種組織數據的格式,長得和 Python 中的列表 / 字典非常相像。它和 html 一樣,常用來做網絡數據傳輸。它用字符串(文本)的方式上傳字典/列表,是所有的語言都可以識別的最朴素的數據類型。因此json 數據就能實現,跨平台,跨語言工作。
在json格式下找到想要的內容。需要把它轉化回列表/字典類型,然應用字典的鍵,列表的下標來找內容。在requests庫的官方文檔中,找到requests庫中解決json的方法。將json解析之后,可以按照對列表和字典的操作完成數據的讀取。
(5)user-agent(用戶代理):使用爬蟲爬取內容時,如果不修改user-agent,其會默認為python,會被很多服務器識別出來,可能會造成無法爬取的結果,而對於爬取某些特定信息,也要求你注明請求的來源,即referer 的內容。處理這些的方法需要將這些內容封裝到一個字典里。
(6)由於網頁限制顯示只有十首歌曲,上面爬取到的只有十首歌曲的歌名或專輯名。
4.遇到的困難和解決點:
(i)實驗前一定要對網頁要足夠熟悉,不熟悉無法進行細致的工作開展。
(ii)user-agent(用戶代理)的認識與使用,需要找尋大量資料進行總結和應用。
(iii)網頁源代碼的熟悉,對各類查詢操作熟悉的掌握和應用。
(iiii)URL以及Headers的准確查找和編程書寫。json庫的正確應用。
