工具及環境
1、操作系統:windows 64位系統
2、軟件工具:谷歌瀏覽器、pycharm集成開發工具
3、第三方庫:request
注:如果第三方庫搭建有困難,請看博客:https://www.cnblogs.com/chuijingjing/p/9157049.html
明確要目標
首先,我們了解一下什么是爬蟲。網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
我們今天要爬的內容是百度音樂里面的音樂,為什么要爬百度音樂呢?當然是因為這個軟件太垃圾了,根本沒有反扒機制,所以我們挑軟柿子捏。像我們的信仰網易雲音樂是不可能讓我們輕易爬到它的內容的,如果想要爬網易雲,要有防反爬機制。我們這次只是簡單介紹爬蟲的原理,寫一個小小的爬蟲,下次我會給大家帶來一個加入防反爬機制復雜的爬蟲。話不多說,讓我們開干!
說干咱就干
1、脈絡梳理
首先,我們把要做的工作先來大體梳理一下,好有一個清晰的脈絡。
1.爬蟲的本質(模擬瀏覽器的行為) 網絡爬蟲; 模擬瀏覽器,訪問互聯網資源,根據我們制定的規則, 批量的下載我們所需要的數據的程序。 2.利用谷歌瀏覽器分析http請求 網絡資源(例如:網上的歌曲、圖片),每一個網絡 資源都有全球唯一的一個url。 url(全球統一資源定位符) F12 打開 network選項監控http請求 3.分析百度音樂的請求流程 下載mp3 倒推法 1、先找到mp3的下載請求 2、歌曲的下載地址也是從服務器請求回來的, 找到下載地址的那個請求,根據歌曲id 3、找到歌曲的id 4.通過python去實現請求
2、瀏覽器設置
我們先進入“百度音樂”,搜索你喜歡的歌手的音樂,我比較喜歡華仔。然后點擊瀏覽器右上方的三個點,選擇“更多工具”,選擇“開發者工具”,進入開發者模式。或者直接按“F12”進入開發者模式。
點擊“Network”,在“Disable cache”前面打上√,不要去緩存,否則死活找不到請求的數據
按照1、2、3、4、5的順序做下來
1:清空內容;
2:回車,發出請求;
3:查看所有請求的信息;
4:每個請求的名字;
5:每個請求的詳細信息。
Header:頭信息
先點完上面三個標注按鈕,然后點擊播放按鈕,播放音樂;
音樂播放幾秒鍾后關閉播放,然后點擊下面的三個按鈕;
接下來就是分析歌曲的頭信息Headers了。
按照圖示,找到網頁文字對應的網頁源碼的信息
上面界面中鼠標右鍵查看頁面源碼,出現下面的源碼界面,按Ctrl+F出現搜索界面,搜索要用到的內容。
3、爬取一首歌曲
由淺入深,我們先來寫一段簡單的代碼,用它來只爬取一首歌。
# -*- coding: utf-8 -*- # the auther is cjj import requests # 導入關於請求模塊 url = 'http://zhangmenshiting.qianqian.com/data2/music/5ebb214edf0a1589e3e1ca58196981e5/594723982/
594723982.mp3?xcode=f6925df9ce85d4400c486914f0acd7b6' # 發送http請求 response = requests.get(url) # response 接收請求回來的數據 print(response.content) # response.content 輸出歌曲的二進制信息 # 把下載下來的歌曲儲存為mp3文件 with open('mp3.mp3','wb') as f: # 把文件以‘f’的名字命名,下面以‘f’為名字打開 f.write(response.content)
這樣,我們就可以實現爬蟲的基本功能了,我們來看一下這首歌能不能聽。
這是你的代碼和歌曲儲存地址,我們去這里來找一下華仔的“慢慢”
果然在這里找到了,雙擊之后發現歌曲可以正常播放。
這樣,我們完成了一個最簡單的歌曲的爬取。
注:文件操作方面如果不了解可以參考:https://www.cnblogs.com/chuijingjing/articles/8034238.html
4、代碼演示
文件操作內容:https://www.cnblogs.com/chuijingjing/articles/8034238.html
字典相關內容:https://www.cnblogs.com/chuijingjing/articles/8007387.html
json相關內容:https://www.cnblogs.com/chuijingjing/articles/8074292.html
正則相關內容:http://www.runoob.com/regexp/regexp-syntax.html
# -*- coding: utf-8 -*- # the auther is cjj import requests import re # 第一步,獲取歌曲的ids search_api = 'http://music.baidu.com/search' # 搜索關鍵字,傳遞參數,通過字典構造 keyword = {'key': '劉德華'} # 發送get請求 params 是傳遞的get參數 response = requests.get(search_api, params=keyword) # 取出html的源碼 response.encoding = 'utf-8' # 編碼轉換 html = response.text # 通過正則表達式獲取id ids = re.findall(r'{"id":"(\d+)"',html) # 第二步,獲取歌曲的信息 mp3_info_api = 'http://play.baidu.com/data/music/songlink' data = { 'songIds': ','.join(ids), 'hq': 0, 'type': 'm4a,mp3', 'rate': '', 'pt': 0, 'flag': -1, 's2p': -1, 'prerate': -1, 'bwt': -1, 'dur': -1, 'bat': -1, 'bp': -1, 'pos': -1, 'auto': -1 } # data就是 post的參數 res = requests.post(mp3_info_api,data=data) # 返回值的數據是就送格式,直接調用json方法,轉成字典 info = res.json() # 第三步,去下載歌曲 # 根據數據的結構獲取歌曲的信息 song_info = info['data']['songList'] # 循環 for song in song_info: # 根據數據結構獲取信息 # 歌名 song_name = song['songName'] # mp3地址 song_link = song['songLink'] # 格式 for_mat = song['format'] # 歌詞地址 lrclink = song['lrcLink'] print(song_name) # 下載mp3 if song_link: # 可能沒有地址 song_res = requests.get(song_link) # 下載 # 寫文件 with open('%s.%s' % (song_name, for_mat),'wb') as f: f.write(song_res.content) # 歌曲是二進制 # 下載歌詞 if lrclink: lrc_response = requests.get(lrclink) # 寫文件 with open('%s.lrc' % song_name, 'w', encoding= 'gbk') as f: f.write(lrc_response.text)
下面是成功爬取到的音樂!