python学习之爬虫(一) ——————爬取网易云歌词
接触python也有一段时间了,一提到python,可能大部分pythoner都会想到爬虫,没错,今天我们的话题就是爬虫!作为一个小学生,关于爬虫其实本人也只是略懂,怀着”Done is better than perfect”的态度硬着头皮开始了这篇文章的撰写!好了,废话不多说!
先说一下今天我们的目的,作为一个音痴但不影响我对于音乐的执着,所以今天我们爬取的是网易云音乐,我们将会通过代码爬取歌词并写入到本地。
作为新手,我很本能就打开页面复制了url,然后用Beautifulsoup解析了网页并打印出来,然后去查找歌词所在的标签,心想这不是so easy吗!写下了以下代码
# -*- coding:utf-8 -*-
import requests
import json
import re
from bs4 import BeautifulSoup
lrc_url = "http://music.163.com/#/song?id=191232"
lyric = requests.get(lrc_url)
soup = BeautifulSoup(lyric.text,'lxml')
print(soup)

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

这才像那么回事了,但是发现里面还多了一些不需要的东西。
第二步,筛选出我们需要的元素,这里我们将用到正则表达式和json,切记用之前先导入这两个模块。加入几行代码,帅选后的结果为:

到这里我们已经基本上完成了我们的工作。最后一步,写入文本就不多说了,这样我们再加上几行代码就搞定了!这里我们先贴上之前的代码
# -*- coding:utf-8 -*-
import requests
import json
import re
lrc_url = 'http://music.163.com/api/song/lyric?' + 'id=' + str(191232) + '&lv=1&kv=1&tv=-1'
lyric = requests.get(lrc_url)
json_obj = lyric.text
j = json.loads(json_obj)
lrc = j['lrc']['lyric']
pat = re.compile(r'\[.*\]')
lrc = re.sub(pat, "", lrc)
lrc = lrc.strip()
print(lrc)
由于本人对歌神的崇拜犹如滔滔江水之连绵不绝,几乎他的每一首歌都很喜欢,所以我想多下几首歌的歌词,热心的吃瓜群众可能会这样提醒我换一首歌,把URL复制进去替换一下不就OK了吗,但是作为一个连吃饭都舍不得下床的极度懒惰者我怎么可能会做这样繁琐的事呢!诶换了一首歌也只是歌曲的ID发生了变化。找到规律了!我们可以定义一个这样的函数根据歌曲的ID去自动下载歌曲的歌词,我们想要下载哪首歌曲的歌词需要输入歌曲的ID就可以了!我们可以看到张学友的主页有50首最热门的单曲,我们姑且就先定一个小目标,下他个50首歌!根据我们刚刚的思路我们只需要从这个页面筛选出这50首歌曲的ID就可以了!这时候我们又遇到了和刚刚一样的问题,print一个居然找不到我们需要的元素。历经千辛万苦终于get到了一个争气的URL,
'http://music.163.com/artist?id=' + str(6460)
同样,经过一番筛我们找到了自己需要的东西,那就是一大串的music_id!说了这么多上代码
# -*- coding:utf-8 -*-
import requests
import json
import re
from bs4 import BeautifulSoup
singer_url = 'http://music.163.com/artist?id=' + str(6460)
web_data = requests.get(singer_url)
soup = BeautifulSoup(web_data.text, 'lxml')
singer_name = soup.select("#artist-name")
r = soup.find('ul', {'class': 'f-hide'}).find_all('a')
r = (list(r))
music_id_set=[]
for each in r:
song_name = each.text # print(each.text)
song_id = each.attrs["href"]
music_id_set.append(song_id[9:])
print(music_id_set)
再来一张效果图

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

思考了一会,觉得代码没有问题啊!于是做了一个标记,可以让我看到是下载到哪个歌手的哪个歌手的哪一首歌时出了错误,机智的我终于找到了问题所在,原来是该歌曲没有提供歌词!于是又添了几行代码引入了异常机制!终于完美了!下面附上源代码及效果图
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import json
import re
top50_singer_url='http://music.163.com/playlist?id=119712779'
web_data=requests.get(top50_singer_url)
soup=BeautifulSoup(web_data.text,'lxml') R=soup.textarea.text#找到歌手ID所在的标签 json_obj=json.loads(R)
top50_singer_ID_set=[]
for each in json_obj:
singer_ID=each['artists'][0]['id']
top50_singer_ID_set.append(singer_ID)#将排名前50的歌手的id存进一个列表 def func(singer_ID1):#定义一个函数,通过一个歌手的id下载其最火的五十首歌的全部歌词 from bs4 import BeautifulSoup
singer_url = 'http://music.163.com/artist?id=' + str(singer_ID1)
web_data=requests.get(singer_url)
soup=BeautifulSoup(web_data.text,'lxml')
singer_name=soup.select("#artist-name") singer_name=singer_name[0].get('title') r=soup.find('ul',{'class':'f-hide'}).find_all('a')
r=(list(r))
music_id_set=[]
music_name_set=[]
for each in r:
song_name=each.text#print(each.text)
music_name_set.append(song_name) song_id=each.attrs["href"]
music_id_set.append(song_id[9:]) dic=dict(map(lambda x,y:[x,y],music_name_set,music_id_set))#将音乐名字和音乐id组成一个字典 from bs4 import BeautifulSoup
def get_lyric_by_music_id(music_id):#定义一个函数,通过音乐的id得到歌词
lrc_url = 'http://music.163.com/api/song/lyric?' + 'id=' + str(music_id) + '&lv=1&kv=1&tv=-1' lyric=requests.get(lrc_url)
json_obj=lyric.text
#print(json_obj)
j=json.loads(json_obj)
#print(type(j))#打印出来j的类型是字典
try:#部分歌曲没有歌词,这里引入一个异常
lrc=j['lrc']['lyric']
pat=re.compile(r'\[.*\]')
lrc=re.sub(pat,"",lrc)
lrc=lrc.strip()
return lrc
except KeyError as e:
pass
x=0
for i in music_id_set:
x=x+1 print(x)
top_50_lyric=get_lyric_by_music_id(i) f=open("F:/projects/scrapy/%s.txt" % singer_name,"ab")#单个文件存储一个歌手的50首热门歌曲的歌词并以歌手的名字命名
try:#引入异常
f.write(top_50_lyric.encode('utf-8')) f.close()
except AttributeError as e2:
pass
for singer_ID in top50_singer_ID_set:#依次将列表中的id代表的歌手的歌词下载下来
singer_ID1=singer_ID
func(singer_ID1)

至此,第一篇学习笔记就要完结了!由于本人才疏学浅,加上又是第一次写博,文章中会出现一些错误或者不规范的地方,希望大家谅解!也欢迎各位大佬指出不足,谢谢大家!!
python学习之爬虫(一) ——————爬取网易云歌词的更多相关文章
- python3爬虫应用--爬取网易云音乐(两种办法)
一.需求 好久没有碰爬虫了,竟不知道从何入手.偶然看到一篇知乎的评论(https://www.zhihu.com/question/20799742/answer/99491808),一时兴起就也照葫 ...
- 爬取网易云音乐评论!python 爬虫入门实战(六)selenium 入门!
说到爬虫,第一时间可能就会想到网易云音乐的评论.网易云音乐评论里藏了许多宝藏,那么让我们一起学习如何用 python 挖宝藏吧! 既然是宝藏,肯定是用要用钥匙加密的.打开 Chrome 分析 Head ...
- python爬虫:了解JS加密爬取网易云音乐
python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...
- 如何用Python网络爬虫爬取网易云音乐歌曲
今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地. 跟着小编运行过代码的筒子们将网易云歌词抓取下来已经不再话下了,在抓取歌词的时候在函数中传入了歌手ID和歌曲名两 ...
- python爬虫+词云图,爬取网易云音乐评论
又到了清明时节,用python爬取了网易云音乐<清明雨上>的评论,统计词频和绘制词云图,记录过程中遇到一些问题 爬取网易云音乐的评论 一开始是按照常规思路,分析网页ajax的传参情况.看到 ...
- 爬虫实战(二) 用Python爬取网易云歌单
最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...
- python网络爬虫&&爬取网易云音乐
#爬取网易云音乐 url="https://music.163.com/discover/toplist" #歌单连接地址 url2 = 'http://music.163.com ...
- Python 爬取网易云歌手的50首热门作品
使用 requests 爬取网易云音乐 Python 代码: import json import os import time from bs4 import BeautifulSoup impor ...
- Python爬取网易云音乐歌手歌曲和歌单
仅供学习参考 Python爬取网易云音乐网易云音乐歌手歌曲和歌单,并下载到本地 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...
随机推荐
- 使用 Http 的 Post 方式与网络交互通信
package zw1; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStream; ...
- NSUserDefaults registerDefaults
NSUserDefaults除了保存和读取功能外,还为我们提供了一个很便捷的方法:registerDefaults. func registerDefaults(registrationDiction ...
- java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)
/*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返 ...
- PPT制作线条动画
0.小叙闲言 今天在用PPT做动画的时候小有心得,百度了一下线条动画制作,有一个贴子里面的讨论,也给了我一些灵感,贴子地址:http://www.rapidbbs.cn/thread-24577-1- ...
- Yii2框架---GII自动生成
本地环境配置完成后.访问路径直接加上/gii 例如 localhost/gii 即可生成YII活动记录类 即可生成模块
- 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次幂。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu
这是PAT中的一道练习题 刚开始的时候我想着直接定义正整数n,结果走了很大的弯路,因为题目中要求n小于10的100次幂,即最大的正整数n有100位,而C语言中整型数字最大占8个字节的存储空间,如果按无 ...
- C++模板学习:函数模板、结构体模板、类模板
C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(i ...
- Hibernate配置文件中配置各种数据库链接
hibernate.properties ###################### ### Query Language ### ###################### ## define ...
- 详解Java动态代理机制(二)----cglib实现动态代理
上篇文章的结尾我们介绍了普通的jdk实现动态代理的主要不足在于:它只能代理实现了接口的类,如果一个类没有继承于任何的接口,那么就不能代理该类,原因是我们动态生成的所有代理类都必须继承Proxy这个类, ...
- OC中的私有变量和私有方法
在类的实现即.m文件中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private得.在 .m中定义的成员变量不能和它的头文件.h中 ...