python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)
Python網易云爬蟲——實現網易云歌詞的爬取(輸入歌手的id,即可實現歌詞的爬取)
開始動手
打開網易云音樂,找到任意一位歌手的歌曲界面(我們以鄧紫棋的《來自天堂的魔鬼》為例)。
第一步:嘗試常規思路,把網頁的源碼爬下來,直接對源碼的分析,提取出來對應的歌詞。上代碼:
運行結果:
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=7" > <title>網易云音樂</title> <style type="text/css"> /* Reset */ body,html,h1,h2,h3,h4,h5,h6,ul,ol,li,dl,dt,dd,header,menu,section,p,input{padding:0;margin:0;} body{font-family:Microsoft Yahei, Arial, Helvetica, sans-serif; ............中間太長省掉了...................... <div class="g-ft"><div class="g-wrap"><div class="m-copy"><p><a href="//gb.corp.163.com/gb/about/overview.html" target="_blank">關于網易</a><span>|</span><a href="#" target="_blank">關于網易云音樂</a><span>|</span><a href="//help.mail.163.com/service.html" target="_blank">客戶服務</a><span>|</span><a href="#" target="_blank">隱私策略</a><span>|</span><a href="#" target="_blank">常見問題</a> </p><p>網易公司版權所有©1997-2019 全國文化市場統一舉報電話:12318 </p></div></div> </div> </body> </html> (鬼知道這是什么玩意,賊長)發現這根本不是我們需要的源碼,根本沒有歌詞。
第二步:在網頁按F12查看元素,點擊網絡,找到post方法中的lyric?csrf_token=,發現真正的url被網易云隱藏掉了。
假的url:
真的url:
發現網易云偷偷的把‘api’換成了“#”,難怪讀取的網頁源碼不對。其而還發現了存在歌詞的url,但是這個url有token認證,可以看到這里需要兩個參數:params和encSecKey,然后瀏覽各大博主的博客,發現一個比較好的繞過方式
第三步:改寫正確的url再試,代碼和上面一樣,就修改一句
運行結果
{"code":-460,"msg":"Cheating"}不信命的我嘗試了N+1次,最終變成了這樣。。。。
{"code":404,"msg":"該資源不存在。"}這時候只能找百度了,然后就知道了網易云大名鼎鼎的反爬蟲,好吧接著百度反反爬蟲,你有反爬蟲,我就試試能不能繞過。
果然經過一番嘗試,我找到了這個:(點這里) 某位大佬的博客
一、 分析網頁請求頭
1、User-Agent:這個是保存用戶訪問該網站的瀏覽器的信息,我上面這個表示的是我通過window的瀏覽器來訪問這個網站的,如果你是用python來直接請求這個網站的時候,這個的信息會帶有python的字眼,所以網站管理員可以通過這個來進行反爬蟲。
2、Referer:當瀏覽器發送請求時,一般都會帶上這個,這個可以讓網站管理者知道我是通過哪個鏈接訪問到這個網站的,上面就說明我是從網易云音樂的主頁來訪問到這個頁面的,若你是用python來直接請求是,就沒有訪問來源,那么管理者就輕而易舉地判斷你是機器在操作。
3、authorization:有的網站還會有這個請求頭,這個是在用戶在訪問該網站的時候就會分配一個id給用戶,然后在后臺驗證該id有沒有訪問權限從而來進行發爬蟲
二、用戶訪問網站的ip
當你這個ip在不斷地訪問一個網站來獲取數據時,網頁后臺也會判斷你是一個機器。就比如我昨天爬的網易云音樂評論,我剛開始爬的一首《海闊天空》時,因為評論較少,所以我容易就得到所有數據,但是當我選擇爬一首較多評論的《等你下課》時,在我爬到800多頁的時候我就爬不了,這是因為你這個ip的用戶在不斷地訪問這個網站,他已經把你視為機器,所以就爬不了,暫時把你的ip給封了
三、反反爬蟲的方式:
1.添加請求頭
2.使用代理ip
既然知道了,然后開始修改代碼,這里我選用添加請求頭的方式:
import requests music_id=input("請輸入歌手的id:") headers={"User-Agent" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) ","Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language" : "en-us","Connection" : "keep-alive","Accept-Charset" : "GB2312,utf-8;q=0.7,*;q=0.7" url = 'http://music.163.com/api/song/lyric?'+ 'id=' + music_id+ '&lv=1&kv=1&tv=-1' r = requests.get(url,headers=headers,allow_redirects=False) #allow_redirects設置為重定向 print(r.text)運行結果:
到這里已經算是成功了,歌詞給我們爬下來了,但是還能進一步優化
最終完整代碼
運行結果:
總結:思路過程,通用方法—網頁分析—token繞過----冒充請求頭—完成爬取
數據爬取之后后面就好辦了,可以加幾行代碼把文件存放到txt文件中,excel表格中或者數據庫中,因人而異。
by 久違 2919.12.10
總結
以上是生活随笔為你收集整理的python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: classin安卓手机安装条件_clas
- 下一篇: 角色转移服务器维护怎么回事,梦幻西游角色