获取QQ音乐排行榜数据

获取qq音乐排行榜的数据,比如内地榜.

首先看一下是否有API。Google发现QQ音乐官方是没有API的,不过有一些第三方的API,比如QQ 音乐API koa2实现。可惜没有我先要的数据的API。

然后我想可以写一个爬虫,看这个网页的结构是比较简单的,想着应该比较简单吧。一般写爬虫是用Python,用Request、BS4、Selenium我之前也用过。因为Python这门语言已经一两年没用了,我最近熟练度比较高的语言是JavaScript,所以打算用JavaScript来看看能否写一个爬虫(而且我一直觉得JS就是为Web而生,怎么能不用来写爬虫)。

JavaScript是可以写爬虫,但是用的人相当的少。查了一下,用来构建HTTP请求的,要么是直接用XMLHttpRequest,要么使用第三方库jQuiry或axios,两者都是对XMLHttpRequest进行了包装而变得易用。相比之下,使用axios更好。于是用了axios来发起HTTP响应。然后使用cheerio来解析请求回来的文档(也可以使用JQuery,cheerio其实是JQ的dom功能实现)。确实还挺简单的,比如下(具体怎么用看axios和cheerio的文档,或者一些别人写的博客即可):

const axios = require("axios");
const cheerio = require("cheerio")
axios.get("www.baidu.com").then(function (response) {var $ = cheerio.load(response.data);var ele = $('#root'); // CSS Selectorconsole.log(ele.text());}).catch(function (error) {console.log(error);});

我直接使用ClassName来定位,反复尝试都出错,我仔细检查过ClassName没搞错,但是总是返回是空。于是,我打算一层一层定位。我所要求的元素在页面里算是藏得比较深的,要经过好十几个标签才定位得到。结果也是失败,我很郁闷,此时我一直以为是库的问题。

做到这,说实话我觉得都有点烦了,因为在JS的DOM里,我一个document.getElementByClass操作能完成东西,怎么nodejs里搞半天还搞不定。而且我直接在html里嵌入JS来用XMLHttpRequest会出现如下的

MusicMain.html:1 Access to XMLHttpRequest at ‘https://y.qq.com/n/yqq/toplist/5.html#stat=y_new.toplist.menu.5’ from origin ‘null’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

这种奇怪的错误,一查,要解决这个错误还要搞一些其他的东西。程序员的懒惰特性就显示出来了。

最后,考虑到用JS写爬虫的人太少,资料也不多。既然出现了问题,查了一下好像没什么结果,所以就放弃了。我想还是用原来的Python写吧。因为我还有其他任务。

其实用BS4和Request就能搞定的爬取任务,写完后,得到的结果还是元素为空。于是我debug,我才发现,在实际抓取页面数据时,我所请求的页面,因为元素层次太深,返回的html文档似乎不全,藏在body div.main div.mod_toplist div.mod_songlist ul里的li里的数据都在http响应返回的html数据里被省略,没了。但是在浏览器的开发模式下,Element里有我要的数据,而Page Source里没有我要的数据元素。而HTTP请求回来的自然是Page Source。这TM这种数据怎么爬?

后来我突然看到一篇博文,他演示了他的爬虫,他发起HTTP请求的网址不是原页面,而是在Develop Tool -> Network 里找到的一个网址。我试了一下,结果这个网址返回就是一个JSON格式的数据。这不就是和JSON RPC API道理一样吗?

好了,于是我看了一下,我要的数据所在的网页,其在Network里也能找到请求返回JSON数据的网址(不过不是显然的,需要你试错找一下)。说实话我还是第一次知道这个…

最后写了如下的一个简单的脚本来完成我所要做的工作:

import json
import requests
from requests.exceptions import RequestExceptionurls = []
# 内地榜 原始 url: https://y.qq.com/n/yqq/toplist/59.html#stat=y_new.toplist.menu.59
# url used to fetch data: (found by using Chrome->develop tool->Network->{Name:musicu.fcg?-=getUCGI33878181047... , Headers: ...})
urls.append("https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI338781810474138&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data=%7B%22detail%22%3A%7B%22module%22%3A%22musicToplist.ToplistInfoServer%22%2C%22method%22%3A%22GetDetail%22%2C%22param%22%3A%7B%22topId%22%3A5%2C%22offset%22%3A0%2C%22num%22%3A20%2C%22period%22%3A%222019_33%22%7D%7D%2C%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%7D")
# 香港地区榜
urls.append("https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI4402678176079893&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data=%7B%22detail%22%3A%7B%22module%22%3A%22musicToplist.ToplistInfoServer%22%2C%22method%22%3A%22GetDetail%22%2C%22param%22%3A%7B%22topId%22%3A59%2C%22offset%22%3A0%2C%22num%22%3A20%2C%22period%22%3A%222019_33%22%7D%7D%2C%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%7D")
# 台湾地区榜
urls.append("https://u.y.qq.com/cgi-bin/musicu.fcg?-=getUCGI4957998463486242&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data=%7B%22detail%22%3A%7B%22module%22%3A%22musicToplist.ToplistInfoServer%22%2C%22method%22%3A%22GetDetail%22%2C%22param%22%3A%7B%22topId%22%3A61%2C%22offset%22%3A0%2C%22num%22%3A20%2C%22period%22%3A%222019_33%22%7D%7D%2C%22comm%22%3A%7B%22ct%22%3A24%2C%22cv%22%3A0%7D%7D")def makeRequest(url):try:headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:return Noneif __name__ == '__main__':for url in urls:data = makeRequest(url)jsonData = json.loads(data)songList = jsonData["detail"]["data"]["data"]["song"]name = jsonData["detail"]["data"]["data"]["titleShare"]print("============", name, "============")for song in songList:print(song["rank"], song["title"], song["singerName"])print('\n')

既然知道了这个东西,之后我觉得如果要获取某个网页的数据的步骤应该是这样了:

  1. 看看是否有官方的API
  2. 是否可以用上面的方法拿到获取数据的url,其实就是要靠自己猜测的JSON API
  3. 以上都不行,可以找找有没有别人第三方的API
  4. 以上都没有,找找有没有别人写好的爬虫
  5. 都没有,自己写爬虫,不过不同水平的人能够解决的爬取问题难度不同。像我这样的菜鸟希望别让我沦落到自己写爬虫的时候。

获取QQ音乐排行榜数据相关推荐

  1. 获取qq音乐json数据---某课网音乐app学习

    移动端qq音乐地址:https://m.y.qq.com/ .抓取QQ音乐数据 请求首页时,有如下链接,回调了jsonp https://c.y.qq.com/splcloud/fcgi-bin/p. ...

  2. php抓取百度风云榜,php正则获取百度音乐排行榜top500

    本文介绍如何使用php正则表达式获取百度音乐排行榜top500数据,并显示在我们自己的网页中, 代码经本人调试成功,可作参考 代码如下:取百度音乐排行榜top500 百度音乐top500 body{ ...

  3. php获取QQ音乐直链,微信小程序-获取QQ音乐直链

    获取QQ音乐直链-用于微信小程序 补充:以下方法获取的直链会有失效期,如果大家有嗅探等工具可以直接上QQ音乐网站获取资源的直链,此方法仅供参考. 问题起源: 最近在做小程序音频播放这一块的时候发现一个 ...

  4. 获取QQ音乐歌曲播放源地址

    获取QQ音乐歌曲播放源地址 播放源其实是像下面这样的地址: http://isure.stream.qqmusic.qq.com/C400001fOGqI49gjpc.m4a?vkey=96FAA1B ...

  5. QQ登录回调地址实现:【获取qq好友列表数据】附实例

    QQ登录回调地址实现:[获取qq好友列表数据] <?php require_once("../../API/qqConnectAPI.php"); $qc = new QC( ...

  6. 学习记录:关于通过使用express,设置reffer和host获取qq音乐数据

    因为qq音乐歌手信息的获取,设置了reffer(设置了url的来源)和host(决定了虚拟机上的哪个站点), 所以通过使用express配置路由, 通过axios来获取数据, 将数据返回给前端请求的路 ...

  7. 照葫芦画瓢之python爬虫系列----(2)初次爬取简单的动态网页数据(网易、QQ音乐排行榜)

    感谢提供素材的同学,无论好坏,高低,我都真心佩服你:参考文章地址:https://mp.weixin.qq.com/s/AXr8BjR_tU-E9YBo-mLVlg 爬取网易云音乐榜单 在上一篇的文章 ...

  8. php获取QQ音乐直链,~~~获取qq音乐外链方法+源码~~~

    本帖最后由 流风T回雪 于 2015-6-17 12:36 编辑 超链接不会去,只能把http后面的//用空格分开了,大家注意一下吧... 都有源码啦!!{:1_931:}求热心求评分 MP3接口 h ...

  9. 获取qq音乐外链方法+源码

    MP3接口 http:/ /tsmusic24.tc.QQ.com/{音乐ID}.mp3 http:/ /stream.qqmusic.tc.qq.com/{音乐ID}.mp3 http:/ /str ...

  10. vue.js最新版获取QQ音乐播放源

    最近在学习使用vue写一个播放器,一直获取不到正确的播放源,QQ对这块限制更加严格了.按照之前的写法,现在已经不能获取到播放源了. 首先,要去抓取QQ音乐的播放源 1.首先在QQ音乐任意播放页面 2. ...

最新文章

  1. Java实现 String类型的ip与整数之间的相互转换(2021.8.1百度提前批面试题)
  2. [汇编] 001基础知识-什么是汇编
  3. 编程中检查IIS7组件的安装情况
  4. VS2010 VS2012 的快捷键
  5. Redis安装及基本配置
  6. ubuntu 14.04 安装chrome及给chromium 安装 flash player
  7. 掌握AI核心技术没有秘籍,能自己创造就是王道
  8. 武汉大学计算机考研 专业课程,2018武汉大学计算机考研复试经验贴
  9. java ee打印功能_Java EE:异步构造和功能
  10. 基于java SSM图书管理系统简单版设计和实现
  11. 每天学一点flash(11) as3.0 与asp 通信 (1)
  12. 11.11开启10分钟 达达承接的京东小时购首单已签收
  13. maven生成jar包
  14. 微信授权+JS-SDK
  15. ie浏览器怎么打开html,IE浏览器无法打开网页如何解决
  16. HCNA之路由优先级及路由冗余备份
  17. Git 和 GitHub
  18. 凡事逐步积累万丈高楼平地起事情的必然趋势
  19. 微软PPM 软件 android,微软Surface Duo带来改进后的手写笔支持 Android系统也可顺滑无迟滞...
  20. 带宽、符号速率、比特率、码元速率、采样速率之间的关系

热门文章

  1. 两个IP组播综合配置示例
  2. C#使用Thread.Sleep()导致程序无响应的解决办法
  3. 元宇宙系统全面学习线路
  4. 计算房贷利率月供相关信息(等额本息)
  5. php imap gmail,php,imap,gmail和dreaded无法连接到'{imap.gmail.com:993 / imap / ssl}'
  6. SteamVR自定义手部抓取姿势
  7. “2022绿色智能制造创赢计划”全新集结:加入这个朋友圈,成为未来主角
  8. c语言编写好的程序运行自动退出,VS 2015 写的第一个c语言控制台程序,运行完程序就自动...
  9. word添加MathType插件
  10. IEEE 802.11标准协议下载