文档章节

爬取OSC乱弹的歌曲

Kinegratii
 Kinegratii
发布于 2017/02/13 14:43
字数 846
阅读 60
收藏 1

Python3

歌曲列表直接点此查看

一 原理分析

爬取路径与结果

爬取路径:博客列表 =》 提取博客链接 =》 获取博客内容 =》 提取歌曲信息,最后获取的结果包含了博客链接、博客标题、歌曲链接,歌曲标题的一个列表。

[
    {'blog_url': 'xxx', 'blog_title': 'xxx', 'music_url': 'xxx', 'music_title': 'xxx'},
    {'blog_url': 'xxx', 'blog_title': 'xxx'},# 该博客歌曲提取失败
]

起点url

爬取的起点url为博客列表的页面链接。

https://my.oschina.net/xxiaobian/blog?catalog=547834&sort=time&p={page}

其中page表示页码,范围取值为1-24,25页之后的乱弹就没有网易云音乐的歌曲了。

歌曲链接

歌曲链接的格式为:http://music.163.com/#/song?id=5038302或者http://music.163.com/#/song/187747/,可归纳为以http://music.163.com/#/song开头的均符合要求。

歌曲标题

首先在博客中查找。歌曲标题通常为 - 分割的一整个段落,表示歌曲和歌手。比如最新博客使用“单独段落+书名号”(如<p>《Victory》- Two Steps From Hell<p>)这种就比较好匹配,没有书名号的就很少能够提取到。

在博客文档中无法找到(通常是由于匹配规则无法覆盖所有情况),向云音乐网站获取数据,注意两点:

  • 需要将 http://music.163.com/#/song?id=28285557 转换成 http://music.163.com/song?id=28285557 格式
  • 网页标题去掉末尾的字符串“- 网易云音乐”即是所需要的歌手歌曲信息。

二 实现

协程并发执行

程序的核心利用协程实现并发执行,和多线程不同,所有代码都在一个线程执行,减少上下文切换,无需要线程之间的锁机制,效率可大大提高。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 —— 《协程 - 廖雪峰的官方网站

程序主要使用了以下几个库:

  • asyncio:Python3标准库,异步IO,
  • aiohttp:异步HTT库,类似于requests的异步实现
  • lxml:html解析,使用xpath语法
  • re:正则表达式

按照aiohttp的文档将每一个HTTP请求和内容解析都包装成一个协程函数:

  • fetch_music_title(song_url)获取歌手歌曲信息
  • fetch_music(blog_url) 获取歌曲信息
  • fetch_blog_list(page) 获取博客列表

根据逻辑将这三个协程包裹新的协程fetch_page_music(page),用于获取每一页博客中的歌曲信息列表。程序运行时,为每一页创建一个fetch_page_music协程并放进事件循环,待所有协程执行完整后处理相关数据并显示。

代码注释

  • loop.run_until_complete() 返回值为各个协程函数的返回值组成的列表
  • //a[@class="blog-title"]表示获取class为blog-title所有a元素
  • //a[starts-with(@href, "http://music.163.com/")]表示获取href值以http://music.163.com/ 开头的所有a元素。
  • itertools.chain.from_iterable(iterable)将数组“压平”,如 [[1,2], [3,4],[5,6]] 返回 [1,2,3,4,5,6]

三 运行原理结果

执行结果

四 其他

源代码

链接:爬取OSC乱弹的歌曲

(要求Python3.5+)

爬取结果

一共爬取了185首歌曲,码云代码片段没有md功能,存自己博客上了,点击访问链接

© 著作权归作者所有

Kinegratii

Kinegratii

粉丝 26
博文 11
码字总数 11517
作品 2
福州
后端工程师
私信 提问
加载中

评论(2)

小小编辑
小小编辑
谢谢 你让我想起来了,@护目评论 现在依然很想念他。
一路南漂
一路南漂
👍 加油!!
我分析了2837首歌曲,做了个信息检索与信息抽取系统

写在前面 首先,作者受到 《我分析了42万字的歌词,为了搞清楚民谣歌手们在唱些什么》 这篇文章的影响,加上自己也是一个音乐爱好者,所以决定做一个网易云热门歌手歌词信息检索与信息抽取系...

牛奶芝麻
2018/08/02
0
0
Java爬虫——网易云热评爬取

爬取目标网址 : http://music.163.com/#/song?id=409649818 需要爬取信息 : 网易云top13热评 使用之前的 HttpURLConnection 获取网页源码,经过分析发现,在源码中并没有热评信息 1 packag...

奶berber
2017/12/09
0
0
中国有嘻哈:网易云、虾米音乐歌词爬虫项目分享

《中国有嘻哈》这款综艺带火了中国的嘻哈音乐,大家问好也都变成了:你有freestyle吗? 相信大家都是因为这篇高大上的微信推送文章来的。 没看到也不要紧,传送带在这里–>爱票子也爱妹子:3...

czl389
2017/08/16
0
0
关于使用requests爬取酷狗hot500的案例

关于使用requests爬取酷狗hot500的案例 1. 案例环境: python版本:python3.x; IDE:anaconda-spider;(已安装好需要的requests,bs4库等) 数据库:mysql.5.7 工具包:pymsql(安装将补充)...

meiqi0538
2018/03/07
0
0
关于爬取指定前缀的网页??

这几天在学习爬虫,想爬一些数据来学习一下。不过遇到一个问题,不太会。 我想爬取指定前缀的所有网页,从大的方面来说,就是爬取指定域名下的所有网页;换小点的可以这样理解:如http://my...

静心天涯
2014/10/07
201
5

没有更多内容

加载失败,请刷新页面

加载更多

Gradle 的项目导入到 IntelliJ 后子项目源代码不能导入

在一个 Gradle 项目中,有若干子项目。 当 Gradle 到如后,子项目不能被 IntelliJ 识别代码。 如下图的这个代码就没有被自动识别。 这个有可能是因为你的这个子项目没有被添加到父项目中。 ...

honeymoose
9分钟前
2
0
苹果cms下载地址及模板地址

https://github.com/magicblack/maccms10 程序下载: https://www.lanzous.com/b204882 教程下载: https://www.lanzous.com/b256378 模板下载: https://www.lanzous.com/b355667 插件下载:......

chenhongjiang
9分钟前
3
0
Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)

一、HttpPost上传文件 public static String getSuffix(final MultipartFile file){ if(file == null || file.getSize() == 0){ return null; } String......

codeobj
10分钟前
1
0
在Word中怎样批量删除空行,这些点主要注意

在工作中经常接触的办公软件就是Word了,熟练使用Word中的技能是准时下班的保证。这就要求我们对Word中的各项技能都熟练于心,很多朋友诉苦Word中的排版不熟悉,每次写一篇文章排版都要花费很...

干货趣分享
16分钟前
2
0
终端-Linux命令之非交互SSH密码验证-Sshpass

> Sshpass是使用SSH所谓的“交互式键盘密码身份验证”以非交互方式执行密码身份验证的工具 通俗来说就是 使用ssh密码登录 是需要在连接时手动输入密码的,没办法明文连接,如下图,需要交互的...

极客收藏夹
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部