此文首发于公众号「brucepk」,欢迎直接去公众号看
“ 阅读文本大概需要 3 分钟
半个月前和媳妇一起去梅赛德斯-奔驰文化中心听了一场 Angela 张韶涵的演唱会,主要是我媳妇是她的粉丝,从小都喜欢她的歌,还凭借她的歌拿到过校园十大歌手比赛的前三名。渐渐的,我也成了她俩的歌迷,哈哈。演唱会开场第一首歌就用了很震撼的「呐喊」,前奏还加了重金属的元素,加上 Angela 清亮的高音,让整首歌听起来更加热血沸腾。本想跟着一起「呐喊」,无奈自己歌词记不住。所以想着用 Python 爬虫写一个网易云音乐的系列。先从基础的爬取歌手的姓名的歌手 id ,之后根据 id 再爬虫歌手名下的歌曲歌词和歌曲评论。
今天就先带大家爬取网易云音乐下的歌手信息并把数据保存下来。
爬取结果
环境
语言:Python
工具:Pycharm
导包
BeautifulSoup:用来解析源码,提取需要的元素。
selenium:因为歌手信息不在页面源代码里,用 selenium 自动化测试库直接获取调试页面的 Elements 元素信息。
csv:数据以 csv 形式保存下来。
程序结构
程序由三部分组成:
get_singer():获取歌手信息。
get_data():数据结构转化,方便储存。
save2csv():保存数据。
代码解析
因页面源码中没有我们需要的数据,用 requests 无法获取,这些元素在 Elements 可以看到,故我们用 selenium 自动化测试库来获取页面。requests 库和 selenium 库的区别详见上次发的文章
这篇文章带你轻松入门 python 爬虫
。
我用的是 Chrome 浏览器,需要把 chromedriver 放在 Python 安装目录下。具体方法上面那篇文章也讲得很详细了。
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 5)
# 设置等待时间
提取歌手信息
子框架的问题需注意下,我们需要的元素信息不在主框架里,需要切换到子框架 g_iframe 里再操作。用 BeautifulSoup 解析元素并用选择器提取出我们需要的信息,最后以 zip 数据对应关系返回数据。
格式转换
把上面返回的数据转换为方便储存的数据,就是把列表里的数据转换为由一个个的字典组成。为了方便查看,我把它打印出来了。
代码如下
数据储存
用 with open(…) as f 保存数据,这种其实是一种简化写法,简化前写法如下
try:
f = open('xxx.csv', 'r')
print(f.read())
finally:
if f:
f.close()
但由于文件读写时都可能产生 IOError,为了保证无论是否出错都能正确地关闭文件,我们用 try … finally 来实现。
Python 简化了改写法,即用 with open(…) as … ,建议之后文件读写都用该写法。
还有个参数需注意,open() 里面 r 或者 a 参数,这有什么含义呢?
主要的参数如下:
r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
上面我用的是 a,因为我保存数据时会不断的循环追加数据,如果用的是 w,那么每次追加数据会覆盖上一次保存的数据。
最后执行 main 函数,我只想获取热门歌手的信息,所以我把 url 中 initial 写死为 -1,当然你也可以获取全部的歌手信息,网页中是按照英文字母 A -Z排列的,对应的 initial 的值分别是 65 - 90,你可以像下面 idlist 一样写成列表,也用一个循环就可以了。
好了,今天的爬虫项目很简单,十几秒的时间已经保存了歌手姓名和歌手 id,歌手 id 数据用于下次爬虫对应歌手歌曲的歌词做准备的。自己赶紧动手试试吧。
公众号回复「歌手」获取源码和爬取结果。
此文章对你有点帮忙的话希望大家能多给点支持,该关注关注,该点赞点赞,该转发转发,有什么问题欢迎在后台联系我,也可以在公众号后台加入技术交流群,群里有大神,可以一起交流学习。
推荐阅读
这篇文章带你轻松入门 python 爬虫
让代码和迈克杰克逊一起跳舞
brucepk
长按二维码关注我们
本公众号专注:
1.python 技术分享
2.python 爬虫分享
3.资料、工具共享
欢迎关注我们,一起成长!
网友评论