python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)

Python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)

开始动手

打开网易云音乐,找到任意一位歌手的歌曲界面(我们以邓紫棋的《来自天堂的魔鬼》为例)。
第一步:尝试常规思路,把网页的源码爬下来,直接对源码的分析,提取出来对应的歌词。上代码:

import requests    #引入request库
url = 'http://music.163.com/#/song?id=36270426'   #网页的url
r = requests.get(url)    #用get的方法获取网页的源码
print(r.text)    #打印出来

运行结果:

<!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>网易公司版权所有&copy;1997-2019 &nbsp; 全国文化市场统一举报电话:12318 </p>
        </div>
    </div>
</div>
</body>
</html>
(鬼知道这是什么玩意,贼长)

发现这根本不是我们需要的源码,根本没有歌词。
第二步:在网页按F12查看元素,点击网络,找到post方法中的lyric?csrf_token=,发现真正的url被网易云隐藏掉了。
假的url:
在这里插入图片描述真的url:
在这里插入图片描述发现网易云偷偷的把‘api’换成了“#”,难怪读取的网页源码不对。其而还发现了存在歌词的url,但是这个url有token认证,可以看到这里需要两个参数:params和encSecKey,然后浏览各大博主的博客,发现一个比较好的绕过方式
第三步:改写正确的url再试,代码和上面一样,就修改一句

url = 'http://music.163.com/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

既然知道了,然后开始修改代码,这里我选用添加请求头的方式:

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)

运行结果:
在这里插入图片描述到这里已经算是成功了,歌词给我们爬下来了,但是还能进一步优化
最终完整代码

import requests
import json
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设置为重定向的参数
#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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久违 °

我看到了月亮

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值