使用scrapy爬取qq音乐
记录一下爬取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¬ice=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¬ice=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¬ice=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音乐相关推荐
- scrapy爬取QQ音乐榜单歌曲及豆瓣电影信息。
系列文章目录 第一章 scrapy爬取起点中文网24小时热销榜单. 第二章 scrapy爬取苏州二手房交易信息. 第三章 scrapy爬取QQ音乐榜单歌曲及豆瓣电影信息. 目录 系列文章目录 前言 一 ...
- scrapy爬取qq音乐
url分析,拿到初始url(start_url) 要爬取的内容为qq音乐的排行榜中的歌曲,首先我们要分析url: 1.打开qq音乐的首页,点击排行榜,右键,检查(谷歌浏览器,其他浏览器各有不同,360 ...
- Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...
- Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...
- python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例
一.前言 qq music上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元 ...
- python爬取qq音乐周杰伦首页歌词
#爬取qq音乐周杰伦首页歌词 #未名编程 import requests from bs4 import BeautifulSoup import json import reURL = 'https ...
- python爬取qq音乐周杰伦_Python爬取QQ音乐url及批量下载
QQ音乐还是有不少的好音乐,有些时候想要下载好听的音乐,如果在网页下载都是还需要登录什么的.于是,来了个QQmusic的爬虫.至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在url吧. 参考 ...
- 【Python爬虫实战】使用Selenium爬取QQ音乐歌曲及评论信息
本文对使用到的技术仅做简单的介绍,若想了解更多,请前往相应的官网网站进行学习. 本文适合对爬虫相关知识接触不多的新手,主要是普及Selenium如何做爬虫,大佬请跳过. 1.Selenium简单介绍 ...
- 爬取qq音乐的评论并生成词云——以《听妈妈的话》为例
爬取qq音乐的评论并生成词云 我们选取的是歌曲的周杰伦的 听妈妈的话 先看效果图 首先,我们进去qq音乐找到这首歌 网易云出来挨打 https://y.qq.com/n/yqq/song/002hXD ...
最新文章
- matplotlib画图
- 英特尔携手中科院计算所建立中国首个 oneAPI 卓越中心
- 数字示波器使用中的欠采样
- C++中函数指针的运用
- C++实现教学信息管理系统
- Codeforces Round #547 (Div. 3) D
- linux终止mysql进程_Ubuntu Linux下定时监测MySQL进程终止时自动重启的方法
- 贝叶斯信念网络Bayes Belief network
- Spring入门第十七课
- python访问文件被拒绝_python – uWSGI服务器日志…权限被拒绝读取文件…哪个文件?...
- clickhouse分布式查询
- 数据库索引类型介绍及其优缺点、区别、适用场景
- Android怎么更换背景色,Android App更改背景颜色
- smartupload java_jspSmartUpload组件使用(一)
- 汽车软件行业工程师详细介绍?(上)
- 关于调用360极速浏览器 2345浏览器的方法
- 操作系统OS-采用分段式存储管理不会产生内部碎片
- IndentationError: unindent does not match any outer indentation level问题
- python3爬虫——模拟登录QQ邮箱
- iOS开发面试—四面字节iOS客户端抖音隐私合规团队
热门文章
- 麦克风阵列之一阶差分麦克风阵列
- Python中的array[:]表示什么意思?记录一个幺蛾子
- 计算机病毒发展趋势论文,计算机病毒的发展趋势及对策
- 第一章 TCP/IP 协议
- 2022-2028全球与中国儿童注意力缺陷和多动障碍市场现状及未来发展趋势
- 全球及中国弹性运动胶带行业发展展望及投资趋势预测报告2022-2027年
- HDU 2550 百步穿杨
- 企业路由器配置L2TP 站点到站点模式Virtual Private Network指南_3(外网访问内网资源)
- 解决docker容器中文字符乱码问题
- DirectX SDK (June 2010) 安装图