记录一下爬取qq音乐的过程

首先我们搜索一个歌手 如:周杰伦

就会得到周杰伦的歌曲列表

我们点击播放,在所有的请求中找到这个:

这个请求就是真正播放歌曲的请求,那我们看一下他的url

http://14.17.73.49/amobile.music.tc.qq.com/C400003aAYrm3GE0Ac.m4a?guid=8465152430&vkey=71464A0A66AF1CCC7974ED1835103700DFE0DB848BE232492CF6A07F0FE615C11D8C6366333D778FF855152C58CAF9DD2EB0CE27DC41D08E&uin=0&fromtag=66

我们通过查看源代码就会发现,这个歌曲不是直接得到的,是发送了其他请求才得到这些歌曲的,我们查看所有请求

在这个请求中我们可以看到返回的歌单,所以这个就是真正得到歌单的请求,将他的url解码一下,得到:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=64527910833662379&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=周杰伦&g_tk=552649071&loginUin=1248658190&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

接着我们可以尝试一下删掉一些参数,精简一下url,最后得到:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?cr=1&p=1&n=20&w=周杰伦

p是页数,n是一页的数量,w是搜索的关键词,cr是啥没弄明白,但是少了不行

返回的json数据中有一个"songmid"属性,这个属性就是一首歌的一个唯一标识属性

我们可以在请求中找到下面这个请求,他的返回结果中就包含了一个"purl"属性

C400003aAYrm3GE0Ac.m4a?guid=8465152430&vkey=71464A0A66AF1CCC7974ED1835103700DFE0DB848BE232492CF6A07F0FE615C11D8C6366333D778FF855152C58CAF9DD2EB0CE27DC41D08E&uin=0&fromtag=66

这个其实就是我们上面歌曲的真正url的后面部分。到此我们就可以得到这个歌了,写到这,我自己都晕了,

还是总结一下,重要的步骤

1.我们使用精简过的url

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?cr=1&p=1&n=20&w=周杰伦

这个可以拿到一个歌单,在这个歌单中我们拿到所有歌的 songmid 属性

2.通过上面的songmid属性使用下面的请求就可以得到一个 purl 属性,这个属性就是真正歌曲的url的后面部分

原url:

https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey1445342736069204&g_tk=552649071&loginUin=1248658190&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"8465152430","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"8465152430","songmid":["003aAYrm3GE0Ac"],"songtype":[0],"uin":"1248658190","loginflag":1,"platform":"20"}},"comm":{"uin":1248658190,"format":"json","ct":24,"cv":0}}

精简后:

https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"8465152430","songmid":["003aAYrm3GE0Ac"],"uin":"0"}}}

3.拼装url得到最终的url

 'http://113.96.98.155/amobile.music.tc.qq.com/' + purl

这三步最关键。

贴上代码

qqm.py

# -*- coding: utf-8 -*-
import re
from io import BytesIOimport scrapy
import json
from copy import deepcopyfrom qqmusic.items import QqmusicItem
import logginglogger = logging.getLogger(__name__)class QqmSpider(scrapy.Spider):name = 'qqm'# allowed_domains = ['qq.com']# 要注意他在qq音乐中的字体,如:久石让 在qq音乐中是 久石譲 这点要注意songer = input("请输入歌手名字(一定要准确):").strip()# songer = '周杰伦'page = 1# 可以修改n后面的数字,默认是20,我改为了50base_url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?cr=1&n=50&w=' + songer + '&p='start_urls = [base_url + str(page)]def parse(self, response):# 请求的歌曲列表my_d = json.loads(re.findall(b'callback\((.*)\)', response.body)[0].decode())song_num = my_d['data']['song']['curnum']# 这一页的歌曲书目不为0,则会请求下一页if song_num > 0:for i in range(song_num):# 搜索一个歌手,但会出现其他歌手的歌,用这个方式排除if my_d['data']['song']['list'][i]['singer'][0]['name'] == self.songer:item = QqmusicItem()item['song_mid'] = my_d['data']['song']['list'][i]['songmid']item['song_name'] = my_d['data']['song']['list'][i]['songname']item['song_author'] = my_d['data']['song']['list'][i]['singer'][0]['name']print('id为:', item['song_mid'], '歌名为:', item['song_name'])url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0&data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"8465152430","songmid":["' + \item['song_mid'] + '"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":24,"cv":0}}'yield scrapy.Request(url, callback=self.parse2, meta={'item': item})self.page = self.page + 1yield scrapy.Request(self.base_url + str(self.page), callback=self.parse)# yield scrapy.Request(url, callback=self.parse2, meta={'item': deepcopy(item)})def parse2(self, response):item = response.meta['item']# 这个会得到这首歌的请求地址my_dict = json.loads(response.body)item['purl'] = my_dict['req_0']['data']['midurlinfo'][0]['purl']url = 'http://113.96.98.155/amobile.music.tc.qq.com/' + item['purl']yield scrapy.Request(url, callback=self.parse3, meta={'item': deepcopy(item)})def parse3(self, response):item = response.meta['item']item['song'] = response.bodyyield item

items.py

# -*- coding: utf-8 -*-# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass QqmusicItem(scrapy.Item):# define the fields for your item here like:song_mid = scrapy.Field()song_name = scrapy.Field()song_author = scrapy.Field()song = scrapy.Field()purl = scrapy.Field()

pipelines.py

# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import osclass QqmusicPipeline(object):def process_item(self, item, spider):if not os.path.exists('F:/spider/music/' + item["song_author"] + '/'):os.makedirs('F:/spider/music/' + item["song_author"] + '/')# if not os.path.exists('F:/spider/music/' + item['name'] + '-' + item['author'] + '.mp3'):with open('F:/spider/music/' + item["song_author"] + '/' + item['song_name'] + '.m4a','wb+') as f:f.write(item['song'])f.close()return item

使用scrapy爬取qq音乐相关推荐

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

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

  2. scrapy爬取qq音乐

    url分析,拿到初始url(start_url) 要爬取的内容为qq音乐的排行榜中的歌曲,首先我们要分析url: 1.打开qq音乐的首页,点击排行榜,右键,检查(谷歌浏览器,其他浏览器各有不同,360 ...

  3. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  4. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

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

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

  6. python爬取qq音乐周杰伦首页歌词

    #爬取qq音乐周杰伦首页歌词 #未名编程 import requests from bs4 import BeautifulSoup import json import reURL = 'https ...

  7. python爬取qq音乐周杰伦_Python爬取QQ音乐url及批量下载

    QQ音乐还是有不少的好音乐,有些时候想要下载好听的音乐,如果在网页下载都是还需要登录什么的.于是,来了个QQmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在url吧. 参考 ...

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

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

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

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

最新文章

  1. matplotlib画图
  2. 英特尔携手中科院计算所建立中国首个 oneAPI 卓越中心
  3. 数字示波器使用中的欠采样
  4. C++中函数指针的运用
  5. C++实现教学信息管理系统
  6. Codeforces Round #547 (Div. 3) D
  7. linux终止mysql进程_Ubuntu Linux下定时监测MySQL进程终止时自动重启的方法
  8. 贝叶斯信念网络Bayes Belief network
  9. Spring入门第十七课
  10. python访问文件被拒绝_python – uWSGI服务器日志…权限被拒绝读取文件…哪个文件?...
  11. clickhouse分布式查询
  12. 数据库索引类型介绍及其优缺点、区别、适用场景
  13. Android怎么更换背景色,Android App更改背景颜色
  14. smartupload java_jspSmartUpload组件使用(一)
  15. 汽车软件行业工程师详细介绍?(上)
  16. 关于调用360极速浏览器 2345浏览器的方法
  17. 操作系统OS-采用分段式存储管理不会产生内部碎片
  18. IndentationError: unindent does not match any outer indentation level问题
  19. python3爬虫——模拟登录QQ邮箱
  20. iOS开发面试—四面字节iOS客户端抖音隐私合规团队

热门文章

  1. 麦克风阵列之一阶差分麦克风阵列
  2. Python中的array[:]表示什么意思?记录一个幺蛾子
  3. 计算机病毒发展趋势论文,计算机病毒的发展趋势及对策
  4. 第一章 TCP/IP 协议
  5. 2022-2028全球与中国儿童注意力缺陷和多动障碍市场现状及未来发展趋势
  6. 全球及中国弹性运动胶带行业发展展望及投资趋势预测报告2022-2027年
  7. HDU 2550 百步穿杨
  8. 企业路由器配置L2TP 站点到站点模式Virtual Private Network指南_3(外网访问内网资源)
  9. 解决docker容器中文字符乱码问题
  10. DirectX SDK (June 2010) 安装图