【Ch10】项目实战:音乐数据爬取_第1页
【Ch10】项目实战:音乐数据爬取_第2页
【Ch10】项目实战:音乐数据爬取_第3页
【Ch10】项目实战:音乐数据爬取_第4页
【Ch10】项目实战:音乐数据爬取_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目实战:音乐数据爬取第十章新工科建设之路·数据科学与大数据系列Python实战之数据库应用和数据库获取1获取全部歌手1.获取全部歌手做网站信息爬取之前,我们先大概了解网页信息的分析方式。打开QQ音乐官网,进入歌手页,网址如下:htps//portal/singer_list.html.在Chrome浏览器下打开该网址,按F12键,可以看到类似图10-1所示的界面。在页面的右侧可以看到一个可选择框,即开发者工具。从开发者工具中可以看到A1、HR、JS、CSS、Img、Media等选项。左下方的name中是页面展示所需资源的链接,右下方中有Headers、Response等选项,可以查看各链接资源的请求头信息、网页源码信息、响应页面信息等。

1.获取全部歌手如图10-2所示,右边用椭圆圈起的General部分展示的是歌手列表的RequestURL.找到歌手列表的URL后,单击右侧的Preview选项,如图10-3所示,可以看到歌手列表信息展示的数据结构形式,singerlist对应的结构。

1.获取全部歌手由这里可以分析歌手列表的URL形式如下:根据该URL,可以进行下一步的数据查看分析,示例代码如下(url_analysis.py):1.获取全部歌手1.获取全部歌手2获取歌手的歌曲数目2.获取歌手的歌曲数目有了歌手列表后,需要查看各歌手的歌曲数目及列表情况。如在热门处单击“A”,再单击“内地”,选择“阿宝”,得到如下URL:htps///n/yqq/singer/003oUwJ54CMqTT.html#stat=y_new.singerlist.singername对该URL得到的页面使用开发者工具进行分析,如图10-4所示。total是当前歌手的全部歌曲数目。list为歌曲列表,每页最多30首歌。singer_mid是歌手的mid,是唯一的,用于标识歌手。2.获取歌手的歌曲数目并且得到如下URL:

可以简化为如下形式:其中,begin为页数,从0开始:num为歌曲数,为页数乘以30所得,即num-(begin+l)*30.singermid、begin、num三者为动态参数。网页分析完后,实现代码如下(singer_song_count.py):2.获取歌手的歌曲数目2.获取歌手的歌曲数目2.获取歌手的歌曲数目执行该PY文件,从打印日志的控制台可以看到类似如下的输出:通过MySQL客户端查看singer_song表,可以看到表中已插入如图10-5所示数据。2.获取歌手的歌曲数目由插入结果可知,以上程序文件已成功从网站爬取歌手歌曲数及歌手mid值。以上示例使用的是单线程处理,使用单线程做大批量数据爬取时会比较慢,耗时比较多。这里引入多线程、多进程做加速。从Python3.2开始,Python标准库提供了concurrent..futures模块,其中提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,对threading和multiprocessing实现了更高级的抽象,对编写线程池和进程池提供了直接的支持。使用ThreadPoolExecutor和ProcessPoolExecutor两个类,可以将以上代码更改为如下更高效的代码形式(multi_pro_singer_song_count.py):2.获取歌手的歌曲数目2.获取歌手的歌曲数目在以上示例代码用ThreadPoolExecutor创建了多个线程,用ProcessPoolExecutor创建了多个进程。执行以上示例代码,可以看到执行速度比单线程、单进程爬取速度提升很多。3获取每首歌曲信息3.获取每首歌曲信息有了歌手歌曲列表后,可以进入具体的歌曲中获取每首歌曲信息。如在歌手阿宝的歌曲列表中单击“花开的时候你就来看我”这首歌,得到页面的URL如下:htps:///n/yqq/song/002AOwqK2rwcrb.html。使用开发者工具分析该页面,可以得到如图10-6所示信息。3.获取每首歌曲信息有了歌手歌曲列表后,可以进入具体的歌曲中获取每首歌曲信息。如在歌手阿宝的歌曲列表中单击“花开的时候你就来看我”这首歌,得到页面的URL如下:htps:///n/yqq/song/002AOwqK2rwcrb.html。使用开发者工具分析该页面,可以得到如图10-6所示信息。其中几个关键字段如下。songname:歌曲名称。albumname:歌曲所属专辑。interval:歌曲时长。songmid:歌曲mid。3.获取每首歌曲信息通过这几个关键信息,就能获取各歌手的所有歌曲信息。示例代码如下(见music_download.py中的get_singer_songs()方法):3.获取每首歌曲信息4歌曲下载4.歌曲下载取得每首歌曲的详细信息后,接下来可以进行歌曲的下载。对歌曲“花开的时候你就来看我”,单击“播放”按钮,跳转到播放页面,播放页面的URL地址如下:https://y.qq,com/portal/player.html。使用开发者工具对该网页进行分析,单击“Media”按钮,可以找到如图10-7所示的信息。对应的URL如下:4.歌曲下载继续分析网页,在JS选项下可以找到如图10-8所示的信息。查找对应的RequestURL,如图10-9所示。观察该URL可以发现以下信息:①C400002AOwqK2rwcrb由C400加002AOwqK2wcrb组成。002AOwqK2wcrb是歌曲对应的songmid,②uin是用户的QQ号码,默认为0.fromtag是一个固定值。guid是用户id,由浏览器生成,也可以自己指定为0.③vkey比较特殊,需要调用URL生成。4.歌曲下载由图10-9可以得到vkey生成的URL如下:对该URL进行简化,可以简化为如下形式:4.歌曲下载其中,songmid和filename可以动态变化。具体取值如图l0-10所示。一切信息准备就绪后,可以开始歌曲下载了。4.歌曲下载歌曲下载示例代码如下(music_download.py中download_music()方法):5歌曲信息持久化5.歌曲信息持久化到此为止,所有歌曲信息处理工作均已完成,接下来做信息的持久化处理。构建信息持久化数据结构,示例代码如下(music_model.py):5.歌曲信息持久化数据库连接代码封装,示例代码如下(sqlalchemy_.conn.py):5.歌曲信息持久化配置文件示例代码(config.py):歌曲下载示例代码(music_download.py):5.歌曲信息持久化5.歌曲信息持久化5.歌曲信息持久化5.歌曲信息持久化执行以上代码,在日志打印控制台可以看到类似如下的输出信息:5.歌曲信息持久化通过MySQL客户端查看song表,可以看到表中已插入如图10-11所示的数据。在文件夹chapter10/musicfile下可以看到下载的音频文件,如图10-12所示。5.歌曲信息持久化该示例代码中直接使用了多线程、多进程的处理方式。本章的示例代码使用的是将数据保存到关系型数据库(MySQL)的方式。这里也可以更改为保存到非关系型数据库(MongoDB)的方式。要修改为保存到MongoDB,更改比较大的一个地方是获取数据库和集合,更改的示例代码如下(mongo_conn.py):5.歌曲信息持久化相对于前面章节的MongoDB的连接方式,该示例代码中需要获取两个集合,所以需要两个集合获取的方法。要获取多个集合的情况,也可以使用该方法。获取歌手歌曲数代码更改比较少,相对于关系型数据库保存数据的方式,只是对数据保存方式做了修改,此处就不详细展示代码了,具体可以参考示例代码(mongo_singer_song_count.py和mongo_multi_singer_song_count.py)。获取每首歌曲信息及歌曲下载的代码更改也比较少,只是对数据保存方式做了修改,此处就不详细展示代码了,具体可以参考示例代码(mongo_.music_download.py)。6可视化展示6.可视化展示经过前面的一番操作后,可以获得QQ音乐网站几乎所有的数据,有了数据后,就可以构建可视化数据报表。结合第9章的知识,下面通过可视化方式展示歌手歌曲数。10.2节的操作已经获取了歌手及歌手歌曲数,并把结果存放到singer_song表,要做歌手歌曲数的可视化,操作singer_song表即可。我们从singer_song表查询出singer_name和song_count两个字段的值进行可视化展示。借助sqlalchemy从singer_song表获取结果的操作方式如下:使用水平图表、饼图等展示结果的操作与第9章类似,此处不再具体阐述。完整的示例代码如下(info_visible.py):6.可视化展示6.可视化展示

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论