python⽹易云爬⾍——实现⽹易云歌词的爬取(输⼊歌⼿的id,即可实现歌词的
爬取)
Python⽹易云爬⾍——实现⽹易云歌词的爬取(输⼊歌⼿的id,即可实现歌词的爬取)
开始动⼿
打开⽹易云⾳乐,到任意⼀位歌⼿的歌曲界⾯(我们以邓紫棋的《来⾃天堂的魔⿁》为例)。
第⼀步:尝试常规思路,把⽹页的源码爬下来,直接对源码的分析,提取出来对应的歌词。上代码:
import requests    #引⼊request库
url = 'music.163/#/song?id=36270426'  #⽹页的url
r = (url)    #⽤get的⽅法获取⽹页的源码
)    #打印出来
运⾏结果:
<!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/gb/about/overview.html" target="_blank">关于⽹易</a><span>|</span>
<a href="#" target="_blank">关于⽹易云⾳乐</a><span>|</span>
<a href="//help.mail.163/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再试,代码和上⾯⼀样,就修改⼀句
url = 'music.163/api/song/lyric?'+ 'id=' + music_id+ '&lv=1&kv=1&tv=-1'
运⾏结果
{"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
既然知道了,然后开始修改代码,这⾥我选⽤添加请求头的⽅式:
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 = 'music.163/api/song/lyric?'+ 'id=' + music_id+ '&lv=1&kv=1&tv=-1'
r = (url,headers=headers,allow_redirects=False)
#allow_redirects设置为重定向
)
运⾏结果:
到这⾥已经算是成功了,歌词给我们爬下来了,但是还能进⼀步优化
最终完整代码
import json
163音乐网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 = 'music.163/api/song/lyric?'+ 'id=' + music_id+ '&lv=1&kv=1&tv=-1'
r = (url,headers=headers,allow_redirects=False)
#allow_redirects设置为重定向的参数
#headers=headers添加请求头的参数,冒充请求头
json_obj = r.text
j = json.loads(json_obj)#进⾏json解析
print(j['lrc']['lyric'])
by 久违 2019.12.10
总结:思路过程,通⽤⽅法—⽹页分析—token绕过----冒充请求头—完成爬取
数据爬取之后后⾯就好办了,可以加⼏⾏代码把⽂件存放到txt⽂件中,excel表格中或者数据库中,因⼈⽽异。
by 久违 2919.12.10