主要运用了Python中的Requests包和json包获取内容,写入到Mongodb数据库并保存,pandas用于导出数据,代码详细我最后会给出github

接口分析并爬取歌单id

我发现html源码并没有我想要的数据,所以分析了Ajax请求,得到了我想要的数据。

在Chrome按F12(或Fn+F12)打开开发者工具,在Network中选择JS,并且刷新页面,找到关于歌单的渲染连接。

点击Headers获取链接https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg,注意参数和headers信息

必须传入referer参数,不然你会得不到请求。它的返回内容只要提取getPlaylist()里面的内容就是json内容,我们可以用json包解析得到一个基于字典(dict)格式的数据块。代码函数如下:

#爬取歌单id
def getDissid(sin,ein):url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36','cookie':'RK=7dNm4/X+Yj; tvfe_boss_uuid=bf00ee54e9081ab4; pgv_pvi=8772238336; pac_uid=1_857193777; pgv_pvid=6457341280; o_cookie=80; ptcz=c761e59c8c8d6bd5198866d02a5cb7313af1af468006c455d6c2b5d26201d42e; pgv_si=s10759168; _qpsvr_localtk=0.08285763449905015; ptisp=ctc; luin=o0857193777; lskey=00010000228dd1371b945c68ecfd3b71d3071425024a7a8a2a23e3ffcb5b9904c9f7088d2ea8c01539ffed92; pt2gguin=o0857193777; uin=o0857193777; skey=@Kydi7w0EI; p_uin=o0857193777; p_skey=HjsE9sEjznJfXk*9KFEeW4VZr6i3*tlXZ2nuzEw8kCg_; pt4_token=c-p6sv3JEboA51cSQ3ABqxM8O80Jct3jYYkgy-aEQuE_; p_luin=o0857193777; p_lskey=000400008f9c296cd10c03a5173d22a184aad124d791568e90e4198beb8ad699a4d02fbfc059f71ab3d8758c; ts_last=y.qq.com/portal/playlist.html; ts_refer=ui.ptlogin2.qq.com/cgi-bin/login; ts_uid=3392060960','referer':'https://y.qq.com/portal/playlist.html'}paramter = {'g_tk':'1089387893','jsonpCallback':'getPlaylist','loginUin':'0','hostUin':'0','format':'jsonp','inCharset':'utf8','outCharset':'utf-8','notice':'0','platform':'yqq','needNewCode':'0','categoryId':'10000000','sortId':'5','sin':sin,#开始结点'ein':ein #结束结点,用于翻页}html = requests.get(url=url,params=paramter,headers=header)res = json.loads(html.text.lstrip('getPlaylist(').rstrip(')'))['data']['list']data = []if res != []:for t_item in res:item = {}ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]') #用于去掉非法字符item['createtime']      = t_item['createtime']item['creator_qq']      = t_item['creator']['qq']item['creator_name']    = t_item['creator']['name']item['creator_name'] = ILLEGAL_CHARACTERS_RE.sub(r'', item['creator_name'])item['creator_isVip']    = t_item['creator']['isVip']item['dissid']          = t_item['dissid']   #item['dissname']        = t_item['dissname']item['dissname'] = ILLEGAL_CHARACTERS_RE.sub(r'', item['dissname'])item['listennum']       = t_item['listennum']data.append(item)return data

歌单接口分析并获取歌单信息和歌曲id,同样的获取方式,打开开发者工具

代码如下

#爬取歌曲id
def getSongid(dissid):url = 'https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg'header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36','referer':'https://y.qq.com/n/yqq/playlist/{}.html'.format(dissid)}paramters = {'type':'1','json':'1','utf8':'1','onlysong':'0','disstid':dissid,'format':'jsonp','g_tk':'1089387893','jsonpCallback':'playlistinfoCallback','loginUin':'0','hostUin':'0','inCharset':'utf8','outCharset':'utf-8','notice':0,'platform':'yqq','needNewCode':0}html = requests.get(url=url,params=paramters,headers=header)cdlist = json.loads(html.text.lstrip('playlistinfoCallback(').rstrip(')'))['cdlist']if len(cdlist)>=1:cdlist = cdlist[0]data1 = {}  #保存歌单信息数据data2 = []  #用于保存歌曲部分信息ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]')data1['desc'] = ILLEGAL_CHARACTERS_RE.sub(r'', cdlist['desc'])data1['dissid'] = dissiddata1['songids'] = cdlist['songids']data1['tags'] = ','.join([i['name'] for i in cdlist['tags']])tags = ','.join([i['name'] for i in cdlist['tags']])for item in cdlist['songlist']:tmp = {}tmp['albumname'] = item['albumname']tmp['songname']  = item['songname']tmp['singer']  = ','.join([i['name'] for i in item['singer']])tmp['tags'] = tagsif item.has_key('size128'):tmp['size128'] = item['size128']if item.has_key('songmid'):tmp['songmid'] = item['songmid']if item.has_key('songid'):tmp['songid'] = item['songid']data2.append(tmp)return [data1,data2]

歌曲详细信息数据的获取,用同样的方法分析接口链接,并且传入歌曲id,这里就不累赘重复方法了,这一步主要目的是获取歌词,用于后续的文本分析。这里要注意的是,由于歌词源码是如图所示的内容,因此我们利用正则对歌词做了稍微的清洗。

#获取歌词内容
def getLyric(musicid,songmid):url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric.fcg'header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36','referer':'https://y.qq.com/n/yqq/song/{}.html'.format(songmid)}paramters = {'nobase64':1,'musicid':musicid, #传入之前获取到的id'callback':'jsonp1','g_tk':'1134533366','jsonpCallback':'jsonp1','loginUin':'0','hostUin':'0','format':'jsonp','inCharset':'utf8','outCharset':'utf-8','notice':'0','platform':'yqq','needNewCode':'0'}html = requests.get(url=url,params=paramters,headers=header)res = json.loads(html.text.lstrip('jsonp1(').rstrip(')'))#由于一部分歌曲是没有上传歌词,因此没有默认为空if res.has_key('lyric'):lyric = json.loads(html.text.lstrip('jsonp1(').rstrip(')'))['lyric']#对歌词内容做稍微清洗dr1 = re.compile(r'&#\d.;',re.S)dr2 = re.compile(r'\[\d+\]',re.S)dd = dr1.sub(r'',lyric)dd = dr2.sub(r'\n',dd).replace('\n\n','\n')return ddelse:return ""

这里在爬取歌曲信息信息和歌词的时候,因为获取到的歌曲id就有70多W(包括重复的),建议开启多线程或者多进程,我就是用pool.map开启了4进程爬取,效率提高了不止4倍,大概2天就爬完了(当然每个人电脑配置不一样,我的比较渣)

数据样式图

心得:

1.获取QQ音乐的接口链接其实不是很难,数据也是很明显就看到了。

2.一开始明明是请求成功,就是返回空数据,后来才发现原来是headers传少了referer参数,因为原先没有传入referer的习惯,忽略了。

3,.歌曲时长里面是没有具体数据的,只有文件大小,不过我想应该可以根据文件大小转化为时长,差个公式。

4.代码中用到了Mongo数据库,因为数据量有点多,不能保证一次性跑完并且中途不出差错,就没有用pandas.to_csv最后写入数据。

详细代码链接:https://github.com/lhtlht/qqmusic

写的不好,多多指正,谢谢!

爬取QQ音乐2W歌单和50W首歌曲相关推荐

  1. python爬虫爬取qq音乐热歌榜的歌曲到本地

    文章目录 项目目标 具体实现步骤 完整代码 运行结果 项目目标 爬取qq音乐热歌榜https://y.qq.com/n/yqq/toplist/26.html到本地文件夹 具体实现步骤 程序思路:用s ...

  2. scrapy爬取QQ音乐榜单歌曲及豆瓣电影信息。

    系列文章目录 第一章 scrapy爬取起点中文网24小时热销榜单. 第二章 scrapy爬取苏州二手房交易信息. 第三章 scrapy爬取QQ音乐榜单歌曲及豆瓣电影信息. 目录 系列文章目录 前言 一 ...

  3. python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例

    一.前言 qq music上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元 ...

  4. 练习---爬取QQ音乐某首歌的评论,并存入Excel表中---以《消愁》为例

    import requests from bs4 import BeautifulSoup import json import xlwt#存储成Excel表格的函数 def save_excel(c ...

  5. python爬取千千音乐榜单_Python爬取QQ音乐榜单数据

    原博文 2020-08-09 12:56 − 1.爬取QQ音乐榜单数据并存入数据库(MySQL) 2.代码 import requests import json from bs4 import Be ...

  6. 【Python爬虫实战】使用Selenium爬取QQ音乐歌曲及评论信息

    本文对使用到的技术仅做简单的介绍,若想了解更多,请前往相应的官网网站进行学习. 本文适合对爬虫相关知识接触不多的新手,主要是普及Selenium如何做爬虫,大佬请跳过. 1.Selenium简单介绍 ...

  7. 爬取qq音乐的评论并生成词云——以《听妈妈的话》为例

    爬取qq音乐的评论并生成词云 我们选取的是歌曲的周杰伦的 听妈妈的话 先看效果图 首先,我们进去qq音乐找到这首歌 网易云出来挨打 https://y.qq.com/n/yqq/song/002hXD ...

  8. 【python】实验2项目2:使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(陈奕迅)

    请使用爬虫Selenium模拟浏览器获取爬取QQ音乐中你喜欢的某位歌手(可以是任意歌手)最受欢迎的前5首歌曲的歌词.流派.歌曲发行时间.评论条数.评论时间.评论点赞次数.评论内容具体(每一首歌的评论& ...

  9. python爬取QQ音乐免费歌曲 2020.7.26

    python爬取qq音乐免费歌曲 2020.7.26 目标分析 获取音乐列表 1.浏览器网络请求追踪 2.寻找音乐列表 解析qq音乐 1.下载连接组成 2.获取vkey 3.获取sign参数 关系图 ...

最新文章

  1. Spring Security实战教程2021版即将下线,2022版即将上线!
  2. 51nod 3 * problem
  3. QT的QDesignerCustomWidgetCollectionInterface类的使用
  4. 微软人工智能和对话平台--知识商城体验
  5. dedecms m view.php,dedecms在php7下的使用方法 织梦dedecsm后台一片空白的解决方法
  6. edxp显示未安装_智能水表安装使用注意事项
  7. AttributeError: 'NoneType' object has no attribute 'append'
  8. 安卓交换位置动画_好马配好鞍,OriginOS系统让安卓系统大变样
  9. vmware虚拟机卸载教程
  10. 什么是等保三级?基本流程是什么样的?
  11. 计算机断层扫描法原理,能谱计算机断层扫描成像的概念和基本原理.PDF
  12. S2FGAN论文阅读
  13. STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发uart例程
  14. go 进阶 多路复用支持: 一. netpoller 初始化
  15. Playwright 中文文档
  16. 慕容不复_拔剑-浆糊的传说_新浪博客
  17. Doolittle分解法(LU分解法)的Python实现
  18. 一文了解Jeff Bezos,电商与公有云的“世界首富”
  19. 微信隐藏功能系列:微信定时提醒,2个步骤,让忙碌中的自己松口气
  20. 阅读笔记——软件工程的瀑布、教堂和集市

热门文章

  1. bigquant量化平台数据精准吗?
  2. 高数考研归纳 - 极限与连续
  3. 【acwing 寒假每日一题(入门组)】day24数独检查
  4. office 180天免费
  5. 应用案例: ENVI图像处理软件和ArcGIS®在灾害救援工作中的应用
  6. AspectJ切面自定义注解实现参数分组校验——基础概念(2)
  7. SSM框架入门知识点跟学雷神视频笔记
  8. 种群相互竞争Matlab,种群相互竞争的Matlab程序
  9. python中base64编码
  10. URIError: URI malformed错误