python学习之爬虫(一) ——————爬取网易云歌词

接触python也有一段时间了,一提到python,可能大部分pythoner都会想到爬虫,没错,今天我们的话题就是爬虫!作为一个小学生,关于爬虫其实本人也只是略懂,怀着”Done is better than perfect”的态度硬着头皮开始了这篇文章的撰写!好了,废话不多说!

  先说一下今天我们的目的,作为一个音痴但不影响我对于音乐的执着,所以今天我们爬取的是网易云音乐,我们将会通过代码爬取歌词并写入到本地。

  作为新手,我很本能就打开页面复制了url,然后用Beautifulsoup解析了网页并打印出来,然后去查找歌词所在的标签,心想这不是so easy吗!写下了以下代码

1 # -*- coding:utf-8 -*-
2 import requests
3 import json
4 import re
5 from bs4 import BeautifulSoup
6 lrc_url = "http://music.163.com/#/song?id=191232"
7 lyric = requests.get(lrc_url)
8 soup = BeautifulSoup(lyric.text,‘lxml‘)
9 print(soup)

卧擦嘞,打印出来了一些什么鬼啊!居然没有找到歌词!怎么办!怎么办!沉思了良久后我觉得我掉进了一个巨坑,事情绝对没有那么简单!.....(心情无比悲痛,此处省略一万字)作为平常屡试不爽的招数今天居然装逼失败!痛定思痛,我觉得肯定是URL的问题,经过一番思索发现原来我找了一个假的URL!几经波折,找到了这样一个URL

‘http://music.163.com/api/song/lyric?‘ + ‘id=‘ + str(191232) + ‘&lv=1&kv=1&tv=-1‘打印出来的效果是这样的:

这才像那么回事了,但是发现里面还多了一些不需要的东西。

第二步,筛选出我们需要的元素,这里我们将用到正则表达式和json,切记用之前先导入这两个模块。加入几行代码,帅选后的结果为:

到这里我们已经基本上完成了我们的工作。最后一步,写入文本就不多说了,这样我们再加上几行代码就搞定了!这里我们先贴上之前的代码

 1 # -*- coding:utf-8 -*-
 2 import requests
 3 import json
 4 import re
 5 lrc_url = ‘http://music.163.com/api/song/lyric?‘ + ‘id=‘ + str(191232) + ‘&lv=1&kv=1&tv=-1‘
 6 lyric = requests.get(lrc_url)
 7 json_obj = lyric.text
 8 j = json.loads(json_obj)
 9 lrc = j[‘lrc‘][‘lyric‘]
10 pat = re.compile(r‘\[.*\]‘)
11 lrc = re.sub(pat, "", lrc)
12 lrc = lrc.strip()
13 print(lrc)

由于本人对歌神的崇拜犹如滔滔江水之连绵不绝,几乎他的每一首歌都很喜欢,所以我想多下几首歌的歌词,热心的吃瓜群众可能会这样提醒我换一首歌,把URL复制进去替换一下不就OK了吗,但是作为一个连吃饭都舍不得下床的极度懒惰者我怎么可能会做这样繁琐的事呢!诶换了一首歌也只是歌曲的ID发生了变化。找到规律了!我们可以定义一个这样的函数根据歌曲的ID去自动下载歌曲的歌词,我们想要下载哪首歌曲的歌词需要输入歌曲的ID就可以了!我们可以看到张学友的主页有50首最热门的单曲,我们姑且就先定一个小目标,下他个50首歌!根据我们刚刚的思路我们只需要从这个页面筛选出这50首歌曲的ID就可以了!这时候我们又遇到了和刚刚一样的问题,print一个居然找不到我们需要的元素。历经千辛万苦终于get到了一个争气的URL,

‘http://music.163.com/artist?id=‘ + str(6460)同样,经过一番筛我们找到了自己需要的东西,那就是一大串的music_id!说了这么多上代码
 1 # -*- coding:utf-8 -*-
 2 import requests
 3 import json
 4 import re
 5 from bs4 import BeautifulSoup
 6 singer_url = ‘http://music.163.com/artist?id=‘ + str(6460)
 7 web_data = requests.get(singer_url)
 8 soup = BeautifulSoup(web_data.text, ‘lxml‘)
 9 singer_name = soup.select("#artist-name")
10 r = soup.find(‘ul‘, {‘class‘: ‘f-hide‘}).find_all(‘a‘)
11 r = (list(r))
12 music_id_set=[]
13 for each in r:
14     song_name = each.text  # print(each.text)
15     song_id = each.attrs["href"]
16     music_id_set.append(song_id[9:])
17 print(music_id_set)

再来一张效果图

有了这些我们就可以根据一个歌手的ID爬取这个歌手的50首热门歌曲的歌词,定义一个函数即可,这里就不贴代码了。就这样我成功的爬取了歌神的50首热门歌曲的所有歌词!讲到这里可能有的朋友说自己的偶像不是学友哥啊,我想爬取其他歌手的歌词,比如说我们的华仔啊,周董啊,天后王菲啊.....于是我就又折腾了一下,找到这样一个页面“华语乐坛歌手历史地位排行top50”(注:歌手排列顺序为网上搬运,不代表单主看法,排行榜出处网址: http://m.icaijing.com)索性我就我把这五十个歌手的50首热门歌曲都爬取下来吧!不料又出了一个问题!下载到某位歌手的一首歌时报错了!

思考了一会,觉得代码没有问题啊!于是做了一个标记,可以让我看到是下载到哪个歌手的哪个歌手的哪一首歌时出了错误,机智的我终于找到了问题所在,原来是该歌曲没有提供歌词!于是又添了几行代码引入了异常机制!终于完美了!下面附上源代码及效果图

 1 # -*- coding:utf-8 -*-
 2 import requests
 3 from bs4 import BeautifulSoup
 4 import json
 5 import re
 6 top50_singer_url=‘http://music.163.com/playlist?id=119712779‘
 7 web_data=requests.get(top50_singer_url)
 8 soup=BeautifulSoup(web_data.text,‘lxml‘)
 9
10 R=soup.textarea.text#找到歌手ID所在的标签
11
12 json_obj=json.loads(R)
13 top50_singer_ID_set=[]
14 for each in json_obj:
15     singer_ID=each[‘artists‘][0][‘id‘]
16     top50_singer_ID_set.append(singer_ID)#将排名前50的歌手的id存进一个列表
17
18
19 def func(singer_ID1):#定义一个函数,通过一个歌手的id下载其最火的五十首歌的全部歌词
20
21
22     from bs4 import BeautifulSoup
23     singer_url  = ‘http://music.163.com/artist?id=‘ + str(singer_ID1)
24     web_data=requests.get(singer_url)
25     soup=BeautifulSoup(web_data.text,‘lxml‘)
26     singer_name=soup.select("#artist-name")
27
28     singer_name=singer_name[0].get(‘title‘)
29
30     r=soup.find(‘ul‘,{‘class‘:‘f-hide‘}).find_all(‘a‘)
31     r=(list(r))
32     music_id_set=[]
33     music_name_set=[]
34     for each in r:
35         song_name=each.text#print(each.text)
36         music_name_set.append(song_name)
37
38         song_id=each.attrs["href"]
39         music_id_set.append(song_id[9:])
40
41
42
43     dic=dict(map(lambda x,y:[x,y],music_name_set,music_id_set))#将音乐名字和音乐id组成一个字典
44
45
46     from bs4 import BeautifulSoup
47     def get_lyric_by_music_id(music_id):#定义一个函数,通过音乐的id得到歌词
48         lrc_url = ‘http://music.163.com/api/song/lyric?‘ + ‘id=‘ + str(music_id) + ‘&lv=1&kv=1&tv=-1‘
49
50         lyric=requests.get(lrc_url)
51         json_obj=lyric.text
52         #print(json_obj)
53         j=json.loads(json_obj)
54         #print(type(j))#打印出来j的类型是字典
55         try:#部分歌曲没有歌词,这里引入一个异常
56             lrc=j[‘lrc‘][‘lyric‘]
57             pat=re.compile(r‘\[.*\]‘)
58             lrc=re.sub(pat,"",lrc)
59             lrc=lrc.strip()
60             return lrc
61         except KeyError as e:
62             pass
63     x=0
64     for i in music_id_set:
65         x=x+1
66
67
68         print(x)
69         top_50_lyric=get_lyric_by_music_id(i)
70
71         f=open("F:/projects/scrapy/%s.txt" % singer_name,"ab")#单个文件存储一个歌手的50首热门歌曲的歌词并以歌手的名字命名
72         try:#引入异常
73             f.write(top_50_lyric.encode(‘utf-8‘))
74
75             f.close()
76         except AttributeError as e2:
77             pass
78 for singer_ID in top50_singer_ID_set:#依次将列表中的id代表的歌手的歌词下载下来
79     singer_ID1=singer_ID
80     func(singer_ID1)

至此,第一篇学习笔记就要完结了!由于本人才疏学浅,加上又是第一次写博,文章中会出现一些错误或者不规范的地方,希望大家谅解!也欢迎各位大佬指出不足,谢谢大家!!


				
时间: 2024-10-14 23:22:01

python学习之爬虫(一) ——————爬取网易云歌词的相关文章

如何用Python网络爬虫爬取网易云音乐歌词

前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌曲ID: 调用网易云歌曲API,获取歌词: 将歌词写入文件,并存入本地. 本文的目的是获取网易云音乐的歌词,并将歌词存入到本地文件.整体的效果图如下所示: 基于Python网易云音乐歌词爬取 赵雷的歌曲 本文以民谣歌神赵雷为数据采集对象,专门采集他的歌曲歌词,其他歌手的歌词采集方式可以类推,下图展示

python爬取网易云周杰伦所有专辑,歌曲,评论,并完成可视化分析

---恢复内容开始--- 去年在网络上有一篇文章特别有名:我分析42万字的歌词,为搞清楚民谣歌手们在唱些什么.这篇文章的作者是我大学的室友,随后网络上出现了各种以为爬取了XXX,发现了XXX为名的文章.我想了想,我能不能也通过爬虫来做些什么呢?先入为主,我也以歌曲作为切入口---周杰伦,是的,我们这一代的生活成长,总是离不开周董的声音的陪伴,那我就来爬取周董的歌曲,歌曲评论,歌词,以及各种有用的信息并做一个可视化吧. 这篇文章适合于python纯小白,因为本人也是python刚刚入门,里面可能很

python爬取网易云音乐歌曲评论信息

网易云音乐是广大网友喜闻乐见的音乐平台,区别于别的音乐平台的最大特点,除了"它比我还懂我的音乐喜好"."小清新的界面设计"就是它独有的评论区了------各种故事汇,各种金句频出.我们可以透过歌曲的评论数来判断一个歌者的市场分量和歌曲的流行度.言归正传,如果我们想要简单爬取指定歌曲的评论内容来做词云或者其他相关数据分析,有没有容易上手的好方法呢? 首先,我们打开网易云音乐的网页版:https://music.163.com/,随便选择一首歌曲,如林志炫版本的<

利用python广西快乐十分源码出租爬取网易云歌手top50歌曲歌词

python广西快乐十分源码出租 dsluntan.com Q:3393756370 VX:17061863513近年来,发展迅速,成为了最炙手可热的语言. 那么如何来进行网易云歌手top50的歌曲歌词爬取呢 首先进行网易云并进行喜欢的歌手搜索如下: 在这里需要注意的是http://music.163.com/#/artist?id=1007170并不是真的我们需要的连接,真实的链接应该是http://music.163.com/artist?id=1007170 搞清楚了连接的问题之后,就要进

python学习笔记——爬虫的抓取策略

1 深度优先算法 2 广度/宽度优先策略 3 完全二叉树遍历结果 深度优先遍历的结果:[1, 3, 5, 7, 9, 4, 12, 11, 2, 6, 14, 13, 8, 10] 广度优先遍历的结果:[1, 3, 2, 5, 4, 6, 8, 7, 9, 12, 11, 14, 13, 10] 4 实践中怎么来组合爬取策略 (1)一般来说,重要的网页距离入口站点的距离很近: (2)广度/宽度优先有利于多爬虫并行进行合作: (3)可以考虑将深度与广度/宽度相结合的方式来实现抓取的策略:优先考虑广

python爬取网易云音乐歌单音乐

在网易云音乐中第一页歌单的url:http://music.163.com/#/discover/playlist/ 依次第二页:http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=35 依次第三页:http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8

python3.基础爬取网易云音乐【超详细版】

简单学习了python爬虫之后,我们就可以嘿咻嘿咻了...因为平时就是用网易云听的歌,也喜欢看歌里的评论,所以就爬网易云音乐评论吧! 正式进入主题 首先还是去找目标网页并开始分析网页结构,如下 上面的三个箭头都是所要找的数据,分别是评论用户,评论和点赞数,都可以用正则表达式找出来,接下来继续找怎样找到下一页的数据,还是用开发者工具,但是当点击下一页的时候,网页的url没有变,说明网页是动态加载,所以就不能在当前网页找数据了,应该在他的xhr文件里找,所以点入network看看,然后也点击下一页一

爬取网易云听歌排行榜歌单制作云词

最近又到了一年一度的年底总结了,网易云音乐如此退出了年度歌单,又一次被刷朋友圈了.作为程序员,就好奇的想验证下结论准不准,随便回顾下爬虫的操作.首先,打开网页版网易云音乐,登录成功后,进入自己或好友的听歌排行榜,如图:直接使用浏览器的开发工具,刷新页面查看接口及其返回结果,找到刷新该列表的接口,如图:找到url后,再找到对应的cookie等值,复制保存.如图:至此,我们已经找到网页所有想要的信息了,下面我们就可以直接用代码实现了.思路:```a.先爬取歌曲列表,获取对应歌曲的信息,存放到数据库,

爬取网易云音乐评论并使用词云展示

最近听到一首很喜欢的歌,许薇的<我以为>,评论也很有趣,遂有想爬取该歌曲下的所有评论并用词云工具展示. 我们使用chrome开发者工具,发现歌曲的评论都隐藏在以 R_SO_4 开头的 XHR 文件中 接下来思路就很明确,拿到该文件,解析该文件的 json 数据,拿到全部评论. 我们可以看到该文件有两个用JS加密的参数 params 和 encSecKey ,关于这两个加密参数,参考了知乎用户的解答:https://www.zhihu.com/question/36081767 . 步骤: 1.