• MacOS Sierra 10.12.1

  • Python 2.7

  • selenium 3.4.3

  • phantomjs

前言


发现自己有时候比挖掘别人来的更加有意义,自己到底喜欢谁的歌,自己真的知道么?习惯不会骗你

搭建爬虫环境


1.安装selenium


pip install selenium
# anaconda环境的可用conda install selenium# 网速不好的可用到https://pypi.python.org/pypi/selenium下载压缩包,解压后使用python setup.py install

2.安装Phantomjs


2.1 Mac版本

步骤一下载包:去这里下载对应版本http://phantomjs.org/download.html
步骤二解压:双击就行,用unzip这都无所谓
步骤三切入路径:cd ~/Downloads/phantomjs-2.1.1-macosx/bin  # 我下的路径的路径是download,版本不一,注意修改
步骤四:chmod +x phantomjs
步骤五: 配置环境,因为我装的的zsh,所以文件需要修改的是~/.zshrc这个文件,加上这句话export PATH="/Users/mrlevo/Downloads/phantomjs-2.1.1-macosx/bin/:$PATH",然后source ~/.zshrc 即可生效(没用zsh的同学,直接修改的文件时~/.bash_profile,添加内容和上述一致)
查看是否生效:phantomjs -v  # 有信息如 2.1.1 则生效

mac若遇到问题请参考PhantomJS 安装

2.2 Win版本

官网http://phantomjs.org/下载PhantomJS解压后如下图所示:

调用时可能会报错“ Unable to start phantomjs with ghostdriver”如图:

此时可以设置下Phantomjs的路径,同时如果你配置了Scripts目录环境变量,可以解压Phantomjs到该文件夹下。可参考 Selenium with GhostDriver in Python on Windows - stackoverflow,整个win安装过程可参考 在Windows下安装PIP+Phantomjs+Selenium],Mac和Linux/Ubuntu 下可参考[ 解决:Ubuntu(MacOS)+phantomjs+python的部署问题

3. 测试安装是否成功


# 进入python环境后执行如下操作# win下操作
>>> from selenium import webdriver  # pip install selenium
>>> driver_detail = webdriver.PhantomJS(executable_path="F:\Python\phantomjs-1.9.1-windows\phantomjs.exe")
>>> driver_detail.get('https://www.baidu.com')
>>> news = driver_detail.find_element_by_xpath("//div[@id='u1']/a")
>>> print news.text
新闻
>>> driver_detail.quit() # 记得关闭,不然耗费内存------------------------------------------------------------------------# mac下操作
>>> from selenium import webdriver  # pip install selenium
>>> driver_detail = webdriver.PhantomJS()
>>> driver_detail.get('https://www.baidu.com')
>>> news = driver_detail.find_element_by_xpath("//div[@id='u1']/a")
>>> print news.text
新闻
>>> driver_detail.quit() # 记得关闭,不然耗费内存

爬取动态数据


获取自己的id号,这个可以自己登陆自己的网易云音乐后获得,就是id=后面那个值

构造爬取的id,因为我发现,每个人的id只要被获取到,他的歌单都是公开的!!!这就节省了自动登录的一步,而且,我还有个大胆的想法,哈哈哈,我还要搞个大新闻!这次先不说~

墙裂推荐先阅读该博客掌握获取元素方法:Python爬虫 Selenium实现自动登录163邮箱和Locating Elements介绍

# -*- coding: utf-8 -*-importtracebackfromseleniumimportwebdriverimportselenium.webdriver.support.uiasuifromselenium.webdriver.common.desired_capabilitiesimportDesiredCapabilitiesimporttimeimportrandom# 存储为文本的子函数defwrite2txt(data,path):f=open(path,"a")f.write(data)f.write("\n")f.close()# 获取该id喜欢音乐的列表defcatchSongs(url_id,url):user=url_id.split('=')[-1].strip()print'excute user:',userdriver=webdriver.PhantomJS()#,executable_path='/Users/mrlevo/phantomjs-2.1.1-macosx/bin/phantomjs')  # 注意填上路径driver.get(url)driver.switch_to_frame('g_iframe')# 网易云的音乐元素都放在框架内!!!!先切换框架try:wait=ui.WebDriverWait(driver,15)wait.until(lambdadriver:driver.find_element_by_xpath('//*[@class="j-flag"]/table/tbody'))# 等待元素渲染出来try:song_key=1wrong_time=0whilewrong_time<5:# 不断获取歌信息,假定5次获取不到值,就判无值可获取,跳出循环try:songs=driver.find_elements_by_xpath('//*[@class="j-flag"]/table/tbody/tr[%s]'%song_key)info_=songs[0].text.strip().split("\n")iflen(info_)==5:info_.insert(2,'None')# 没有MV选项的进行插入Nonenew_line='%s|'%user+'|'.join(info_)song_key+=1#new_line = "%s|%s|%s|%s|%s|%s|%s"%(user,info_[0],info_[1],info_[2],info_[3],info_[4],info_[5])printnew_linewrite2txt(new_line.encode('utf-8'),user)# mac写入文件需要改变字符,以id命名的文件,存储在执行脚本的当前路径下,在win下请去掉编.endcode('utf-8')exceptExceptionasex:wrong_time+=1# print exexceptExceptionasex:passexceptExceptionasex:traceback.print_exc()finally:driver.quit()# 获取id所喜爱的音乐的urldefcatchPlaylist(url):driver=webdriver.PhantomJS()#,executable_path='/Users/mrlevo/phantomjs-2.1.1-macosx/bin/phantomjs')  # 注意填上路径driver.get(url)driver.switch_to_frame('g_iframe')# 网易云的音乐元素都放在框架内!!!!先切换框架try:wait=ui.WebDriverWait(driver,15)wait.until(lambdadriver:driver.find_element_by_xpath('//*[@class="m-cvrlst f-cb"]/li[1]/div/a'))# 根据xpath获取元素urls=driver.find_elements_by_xpath('//*[@class="m-cvrlst f-cb"]/li[1]/div/a')favourite_url=urls[0].get_attribute("href")exceptExceptionasex:traceback.print_exc()finally:driver.quit()# print favourite_urlreturnfavourite_urlif__name__=='__main__':forurlin['http://music.163.com/user/home?id=67259702']:# 这里把自己的id替换掉,想爬谁的歌单都可以,只要你有他的idtime.sleep(random.randint(2,4))# 随机休眠时间2~4秒url_playlist=catchPlaylist(url)time.sleep(random.randint(1,2))catchSongs(url,url_playlist)

不出意外的话,你的执行脚本的目录下会产生一个以你的id命名的文件,里面打开应该是这样的

67259702|2|因为了解|None|04:08|汪苏泷|慢慢懂
67259702|3|潮鳴り|None|02:37|折戸伸治|CLANNAD ORIGINAL SOUNDTRACK
67259702|4|每个人都会|None|02:58|方大同|橙月 Orange Moon
67259702|5|Don't Cry (Original)|MV|04:44|Guns N' Roses|Greatest Hits
67259702|6|妖孽(Cover:蒋蒋)|None|02:58|醉影An|醉声梦影
67259702|7|好好说再见(Cover 陶喆 / 关诗敏)|None|04:06|锦零/疯疯|zero
67259702|8|好好说再见(cover陶喆)|None|03:34|AllenRock|WarmCovers ·早# 这边分别爬取的数据结构是: id|歌次序|歌名|是否有MV|时长|歌手|专辑

Show数据-ROUND1


接下来就是处理自己下好的自己的歌单了,为了方便起见,我在构造爬取代码的时候,已经构造的比较好了,这也就帮助大家减少了数据预处理的时间了,一般来说,数据不会那么干净的。

我只是做了最简单的歌手词云的例子,数据比较丰富的情况下,自己处理吧,想做什么统计都可以,或许以后我会补上可视化相关的一些例子

1. 自定义遮罩层版本


# -*- coding: utf-8 -*-# 如果还不清楚词云怎么搞,请参考这里https://mp.weixin.qq.com/s/0Bw8QUo1YfWZR_Boeaxu_Q,或者自行百度,很简单的一个包importnumpyasnpimportPIL.ImageasImagefromwordcloudimportWordCloud,ImageColorGeneratorimportmatplotlib.pyplotasplt# 统计词频# win的用户,把解码去掉即可,因为当时mac写入的文件有编码,所以读出来需要解码defstatistics(lst):dic={}forkinlst:ifnotk.decode('utf-8')indic:dic[k.decode('utf-8')]=0dic[k.decode('utf-8')]+=1returndicpath='67259702'# 自己路径自己搞定list_=[]withopen(path,'r')asf:forlineinf:list_.append(line.strip().split('|')[-2].strip())dict_=statistics(list_)# the font from github: https://github.com/adobe-fontsfont=r'SimHei.ttf'coloring=np.array(Image.open("screenshot.png"))# 遮罩层自己定义,可选自己的图片wc=WordCloud(background_color="white",collocations=False,font_path=font,width=1400,height=1400,margin=2,mask=np.array(Image.open("screenshot.png"))).generate_from_frequencies(dict_)# 这里采用了generate_from_frequencies(dict_)的方法,里面传入的值是{‘歌手1’:5,‘歌手2’:8,},分别是歌手及出现次数,其实和jieba分词# 之后使用generate(text)是一个效果,只是这里的text已经被jieba封装成字典了image_colors=ImageColorGenerator(np.array(Image.open("screenshot.png")))plt.imshow(wc.recolor(color_func=image_colors))plt.imshow(wc)plt.axis("off")plt.show()wc.to_file('mymusic2.png')# 把词云保存下来 

2. 方块版本


# -*- coding: utf-8 -*-# 稍微修改下参数,就是另一幅图,这是没有遮罩层的importnumpyasnpimportPIL.ImageasImagefromwordcloudimportWordCloud,ImageColorGeneratorimportmatplotlib.pyplotasplt# 统计词频defstatistics(lst):dic={}forkinlst:ifnotk.decode('utf-8')indic:dic[k.decode('utf-8')]=0dic[k.decode('utf-8')]+=1returndicpath='67259702'# 自己路径自己搞定list_=[]withopen(path,'r')asf:forlineinf:list_.append(line.strip().split('|')[-2].strip())dict_=statistics(list_)# the font from github: https://github.com/adobe-fontsfont=r'SimHei.ttf'coloring=np.array(Image.open("screenshot.png"))wc=WordCloud(collocations=False,font_path=font,width=1400,height=1400,margin=2,).generate_from_frequencies(dict_)# 这里采用了generate_from_frequencies(dict_)的方法,里面传入的值是{‘歌手1’:5,‘歌手2’:8,},分别是歌手及出现次数,其实和jieba分词# 之后使用generate(text)是一个效果,只是这里的text已经被jieba封装成字典了image_colors=ImageColorGenerator(np.array(Image.open("screenshot.png")))plt.imshow(wc)plt.axis("off")plt.show()wc.to_file('mymusic2.png')# 把词云保存下来 

SHOW数据-ROUND2


刚看到个好玩的,迫不及待的试了下,这是关于语种翻译的API接口,阿里云买的,0.01=1000条,买买买,买来玩玩试试自己歌曲语种

# -*- coding:utf-8 -*-# 调用的阿里云的API接口实现语种翻译# API官网:https://market.aliyun.com/products/57124001/cmapi010395.html?spm=5176.730005.0.0.UrR9bO#sku=yuncode439500000importurllib,urllib2,sysimportssldefLang2Country(text):host='https://dm-12.data.aliyun.com'path='/rest/160601/mt/detect.json'method='POST'appcode='xxxxx'# 购买后提供的appcode码querys=''bodys={}url=host+pathbodys['q']=textpost_data=urllib.urlencode(bodys)request=urllib2.Request(url,post_data)request.add_header('Authorization','APPCODE '+appcode)# 根据API的要求,定义相对应的Content-Typerequest.add_header('Content-Type','application/x-www-form-urlencoded; charset=UTF-8')ctx=ssl.create_default_context()ctx.check_hostname=Falsectx.verify_mode=ssl.CERT_NONEresponse=urllib2.urlopen(request,context=ctx)content=response.read()if(content):# print(content)returncontentelse:returnNone# 67259702|1|Claux - 水之畔(8lope Remix) (feat. 陶心瑶)|None|02:44|8lope|水之畔(feat. 陶心瑶) (8lope Remix)list_songs=[]list_songwithsinger=[]withopen('67259702')asf:# 文件名写上次爬下来的forlineinf:line_split=line.split('|')list_songs.append(line_split[2])list_songwithsinger.append(line_split[2]+line_split[5])# 调用接口进行语种识别dict_lang={}foriinrange(537):try:content=Lang2Country(list_songwithsinger[i])lag_=json.loads(content)['data']['language']iflag_notindict_lang:dict_lang[lag_]=0dict_lang[lag_]+=1except:passprintdict_lang# {u'ru': 1, u'fr': 9, u'en': 111, u'zh': 259, u'pt': 21, u'ko': 8, u'de': 7, u'tr': 15, u'it': 47, u'id': 2, u'pl': 7, u'th': 1, u'nl': 10, u'ja': 17, u'es': 20}

ok,数据准备好了,接下来可视化就好了!这次我用Echarts,换个口味的就不用云词了,来个统计效果好看点的!

# 进入该网页:http://echarts.baidu.com/demo.html#pie-simple# 然后把里面的内容替换掉就行option={title:{text:'哈士奇说喵喜欢的音乐',x:'center'},tooltip:{trigger:'item',formatter:'{b} : {c} ({d}%)'},legend:{orient:'vertical',left:'left',data:['中文','英文','俄语','法语','葡萄牙语','韩语','德语','土耳其语','意大利语']},series:[{name:'访问来源',type:'pie',radius:'55%',center:['50%','60%'],itemStyle:{normal:{label:{show:true,formatter:'{b} : {c} ({d}%)'},}},data:[{value:259,name:'中文'},{value:111,name:'英文'},{value:1,name:'俄语'},{value:9,name:'法语'},{value:21,name:'葡萄牙语'},{value:8,name:'韩语'},{value:7,name:'德语'},{value:15,name:'土耳其语'},{value:47,name:'意大利语'},{value:2,name:'印尼语'},{value:7,name:'波兰语'},{value:1,name:'泰语'},{value:10,name:'荷兰语'},{value:17,name:'日语'},{value:20,name:'西班牙语'},],}]};

Pay Attention


  • 这里遇到的最大问题,就是网易云的网页竟然还iframe框来做!!!不切入那个内联框架连phantomjs都无能为力!!这是最值得注意的一点,即使你找对了元素,也可能获取不到值!

  • 如果是win的计算机,在 driver = webdriver.PhantomJS()里面填上phantomjs.exe的路径,上面抓取数据的代码里面有两个需要引擎需要填写路径

  • 如果有打印出字段,但是记录的数据为0KB,那么是文件没有写进去,对于win的用户,把代码写入的部门,编码方式去掉即可

  • 有些win的小伙伴反应路径都加载对了,但是还是找不到exe,那么请在路径前面加r比如 executable_path=r"F:\Python\phantomjs-1.9.1-windows\phantomjs.exe"

结论


果然一下子就看出是上个世纪九十年代的人(:,还有就是,音乐不分国界,就是动感~

附录


对照表

基于python的音乐数据分析可视化相关推荐

  1. 基于python的音乐数据分析_Python对QQ音乐进行爬取并进行数据分析

    三方包引入 使用到了以下包: 爬虫 scrapy 网络测试 requests 数据分析 numpy和pandas 绘图 matplotlib和wordcloud pip install scrapy ...

  2. 基于python的音乐数据分析_[译] 你的歌单无聊吗?关于音乐和机器学习的数据分析...

    原作者   Juan De Dios Santos 编译 CDA 编译团队 本文为  CDA 数据分析师原创作品,转载需授权 Spotify 是全球最大的正版流媒体音乐服务平台,深受全球用户的喜爱.那 ...

  3. 【毕业设计】基于python的旅游数据分析可视化系统 -大数据 旅游数据分析

    文章目录 0 前言 1 课题背景 2 数据处理 3 数据可视化工具 3.1 django框架介绍 3.2 ECharts 4 Django使用echarts进行可视化展示(mysql数据库) 4.1 ...

  4. 基于python 的电影票房可视化系统

    一.介绍 电影票房可视化系统是一个实时分析电影票房的系统,应用Python爬虫.Flask框架.Echarts等技术实现. 二.系统运行图 首页 实时票房排名 票房排行top10 电影类型票房占有率 ...

  5. 基于python的电影爬虫可视化系统设计与实现

    大数据时代的到来,随着人们线上互动以及网络交易,用户的信息数据完全充斥着网络,个体对产品及服务的偏好可以从这些数据中完全体现出来,为商家以及平台提供了更好的发展方向.但是要人为获取数据库中的大量数据信 ...

  6. 基于python的音频播放器_基于python实现音乐播放器代码实例

    基于python实现音乐播放器代码实例,一首,函数,按钮,布局,音乐 基于python实现音乐播放器代码实例 易采站长站,站长之家为您整理了基于python实现音乐播放器代码实例的相关内容. 核心播放 ...

  7. python检索论文_一种基于Python的音乐检索方法的研究

    应用技术 0 前言 最近两年,人们对于流行音乐的追求与需求量日益增 加,但如何保证用户能在不知歌名只知歌词的情况下,完成 自己的全方面多种类的听歌需求呢?于是,电脑工程师就推 出了"听歌识曲 ...

  8. 基于 Python 的招聘信息可视化分析系统

    温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目简介 本项目利用 Python 从某招聘网站抓取海量招聘数据,进行数据清洗和格式化后存储到关系型数据库中( ...

  9. 大学计算机课程报告python_基于python语言和数据分析的大学公共计算机课程方案...

    基于 python 语言和数据分析的大学公共计算机课程方案 云太真 [期刊名称] <电脑知识与技术> [年 ( 卷 ), 期] 2018(014)025 [摘要] 目前的大学公共计算机课程 ...

最新文章

  1. python3官方最新下载-Python
  2. netty4搭建简单的http服务器
  3. SpringBoot2.0实现静态资源版本控制
  4. 比较两个字符串的相似度算法
  5. 云计算的概念_云计算概念掀起涨停潮 美利云奠定板块龙头地位
  6. 【Gamma】 Phylab 发布说明
  7. 连载8:时域信号相乘相当于频域卷积
  8. IEC61850建模说明
  9. Google App Engine初探
  10. 计算机辅助园林设计ps,《CAD PS辅助园林设计》课程教学大纲.doc
  11. 解决:启动word等office相关软件时,比较慢,会卡在一步Foxit PDF Creator COM Add-in很久
  12. 致远V8.1 协同 最新版
  13. android 微信小程序 gps 飘,微信小程序实现自动定位功能
  14. 怎么用计算机按log以2为底,log以2为底4的对数在计算器上怎么按?
  15. Noteability和GoodNotes日常使用细节对比
  16. PyQt5 组合键
  17. 刘津:职业生涯的前一半是靠努力,后一半是靠创新
  18. google提示这个不是私密连接
  19. 阿里云IoT平台APP配网入口
  20. Airbnb房源信息爬取(一)——获取城市列表

热门文章

  1. SmartGit的使用
  2. “有信云杯”大数据管理与应用创新大赛完美落幕,激发学子数字化创新活力
  3. 新手小白,做短视频自媒体如何赚钱?这几点你需要知道
  4. springboot nginx动静分离
  5. 基于深度学习的视觉目标检测技术综述
  6. python randint什么分布_Randint并不总是遵循均匀分布
  7. Correlate-and-Excite: Real-Time Stereo Matching viaGuided Cost Volume Excitation(CoEx)(一)论文翻译
  8. 科目二练车 注意事项
  9. Win10《芒果TV》送7天免费会员,邀您抢先看萌心自制《妈妈是超人3》
  10. 【Sql】安装Sql server2019/2016的时候停留在:安装程序无法与下载服务器联系。