scrapy遇上ajax,抓取QQ音乐周杰伦专辑与歌词(6)

手把手教你使用Python抓取QQ音乐数据! 【一、项目目标】 通过Python爬取QQ音乐数据(一)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名、专辑名、播放链接。 此次我们在之前的基础上获取QQ音乐指定歌曲的歌词及前15个精彩评论。 【二、需要的库】 主要涉及的库有:requests、json、html 【三、项目实现】 1.以歌曲“泡沫”为例,查看该界面的XHR 2.通过对XHR的Size进行排序,逐个查看(参考英文含义),我们看到第一个红框内是歌曲评论,第二个框内是歌词! 3.分别查看这两条.. 阅读详情

目录

  • 序言
  • 分析网页
  • 分析请求
  • 代码实现
  • 瞎比比

序言

好久没写原创文章,早就手痒痒了,所以挤出时间写了这篇,这是下面这五篇文章的连载文章:
(1)
(2)
那这段时间我都去干嘛了呢?时间都用在写小程序(编程面试题库)了,现在也已经写得七七八八了,别看这小程序功能不多。但要做的内容倒是挺多的,给它配了个面试题库的爬虫系统,后台内容管理系统。其中用到了很多技术栈,python、nodejs、flask、koa2(nodejs库)、前端、小程序、scrapy、docker、mysql、mongodb等等。结合起来使用还是挺考验人的,通过这次使用,又复习了一下前端,但依然是个前端小渣渣。
作为一个老杰迷,从四年级就开始听 jay 的歌。明天是杰伦的生日,感觉再不搞点小动作还真是对不起杰伦了。这次写文呢,是专门献给杰伦的。

分析网页

如果你做的是网页爬虫,那么首先要做的是:分析这个网页是服务端渲染还是客户端渲染,即是判断该网页是同步请求还是异步请求?这个很简单,我很早就介绍过一个 Chrome 插件,如图

具体用法请查看我的历史文章。
使用工具关闭 JavaScript 请求之后,我们得到的页面是这样的:

关闭 JavaScript
打开之后是这样的:
开启 JavaScript
很明显,这是一个异步请求。接下来就是在众多请求中找到歌词的请求,如图:

分析请求

接下来没啥,就分析这个请求的参数。通过翻页之后,我们来看看两个请求之间是参数对比。
第一页歌词请求参数
第二页歌词请求参数
我们可以看出 p 是页码的意思,w 是关键词的意思,第一个红框和最后一个红框是有不同的。经过我的分析,第一个红框不变也没关系,一样是可以使用。那第二个红框是怎么来的?这里,我先不讲解,因为这与本文的主题不太相关,我会安排更详细的文章告诉你,它究竟是怎么来的。深层次的原因是,我后面会有反爬虫系列的文章,这个内容刚好在规划在那个系列里面。但结论我们可以先用,结论就是:这些数字就是一些随机数,我们用代码生成随机数便是。

代码实现

访问首页

首先,先访问首页,拿到 cookie 等信息,以免后面被封掉。

class Spider(scrapy.Spider):
    name = 'qq'
    allowed_domains = ['jianshu.com']
    start_urls = ['https://y.qq.com/portal/search.html#page=2&searchid=1&remoteplace=txt.yqq.top&t=lyric&w=%E5%91%A8%E6%9D%B0%E4%BC%A6']

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url, callback=self.parse, dont_filter=True)
实现异步请求

生成必要参数,拼接请求链接。

def parse(self, response):
    import random
    lyric_list = []
    # 一共有 39 页歌词,这里我就不再解析了,直接拿过来用
    for page in rang(1,39):
        page = str(page)
        # 生成随机数
        MusicJsonCallback = 'MusicJsonCallback' + str(random.random()).replace('0.', '') + str(random.randint(0, 9))
        url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&remoteplace=txt.yqq.lyric&searchid=96611612886809799&aggr=0&catZhida=1&lossless=0&sem=1&t=7&p=' + page + '&n=10&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&jsonpCallback=' + MusicJsonCallback + '&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0'
        lyric_list.append(url)
        for url in lyric_list:
            yield Request(url=url, method='GET',  # GET or POST
                  callback=self.parseLyric, dont_filter=True)
解析歌曲

解析部分,为了方便查看,这里我就不一一删除了输出语句了。
返回结果(部分):

MusicJsonCallback5105102031857011({"code":0,"data":{"keyword":"周杰伦","lyric":{"curnum":10,"curpage":2,"list":[{"albumid":56705,"albummid":"000bviBl4FjTpO","albumname":"跨时代","albumname_hilight":"跨时代","alertid":23,"belongCD":0,"cdIdx":3,"chinesesinger":0,"content":"烟花易冷 - <em>周杰伦</em> (Jay Chou)\\n 词:方文山\\n 曲:<em>周杰伦</em>\\n 编曲:黄雨勋\\n 繁华声 遁入空门 折煞了世人\\n 梦偏冷 辗转一生 情债又几本\\n 如你默认 生死枯等\\n 枯等一圈 又一圈的 年轮\\n 浮屠塔 断了几层 断了谁的魂\\n 痛直奔 一盏残灯 倾塌的山门\\n 容我再等 历史转身\\n 等酒香醇 等你弹 一曲古筝\\n 雨纷纷 旧故里草木深\\n 我听闻 你始终一个人\\n 斑驳的城门 盘踞着老树根\\n 石板上回荡的是 再等\\n 雨纷纷 旧故里草木深\\n 我听闻 你仍守着孤城\\n 城郊牧笛声 落在那座野村\\n 缘份落地生根是 我们\\n 听青春 迎来笑声 羡煞许多人\\n 那史册 温柔不肯 下笔都太狠\\n 烟花易冷 人事易分\\n 而你在问 我是否还 认真\\n 千年后 累世情深 还有谁在等\\n 而青史 岂能不真 魏书洛阳城\\n 如你在跟 前世过门\\n 跟着红尘 跟随我 浪迹一生\\n 雨纷纷 旧故里草木深\\n 我听闻 你始终一个人\\n 斑驳的城门 盘踞着老树根\\n 石板上回荡的是 再等\\n 雨纷纷 旧故里草木深\\n 我听闻 你仍守着孤城\\n 城郊牧笛声 落在那座野村\\n 缘份落地生根是 我们\\n 雨纷纷 旧故里草木深\\n 我听闻 你始终一个人\\n 斑驳的城门 盘踞着老树根\\n 石板上回荡的是 再等\\n 雨纷纷 雨纷纷 旧故里草木深\\n 我听闻 我听闻 你仍守着孤城\\n 城郊牧笛声 落在那座野村\\n 缘份落地生根是 我们\\n 缘份落地生根是 我们\\n 伽蓝寺听雨声盼 永恒","docid":"17014914173155710954","download_url":"http://soso.music.qq.com/fcgi-bin/fcg_download_lrc.q?song=烟花易冷&singer=周杰伦&down=1&songid=680279&docid=17014914173155710954","interval":263,"isonly":1,"lyric":" 曲:<em>周杰伦</em>\\n 编曲:黄雨勋\\n 繁华声 遁入空门 折煞了世人\\n","media_mid":"004emQMs09Z1lz","msgid":14,"nt":2495419518,"pay":{"payalbum":0,"payalbumprice":0,"paydownload":1,"payinfo":1,"payplay":0,"paytrackmouth":1,"paytrackprice":200},"preview":{"trybegin":61557,"tryend":110138,"trysize":0},"pubtime":1274112000,"pure":0,"singer":[{"id":4558,"mid":"0025NhlN2yWrP4","name":"周杰伦","name_hilight":"<em>周杰伦</em>"}],"size128":4217251,"size320":10533794,"sizeape":27633930,"sizeflac":28429729,"sizeogg":5891914,"songid":680279,"songmid":"004emQMs09Z1lz","songname":"烟花易冷","songname_hilight":"烟花易冷","strMediaMid":"004emQMs09Z1lz","stream":1,"switch":636675,"t":1,"tag":11,"type":0,"ver":0,"vid":""},{"albumid":194021,"albummid":"003Ow85E3pnoqi","albumname":"十二新作","albumname_hilight":"十二新作","alertid":23,"belongCD":0,"cdIdx":8,"chinesesinger":0,"content":"红尘客栈 - <em>周杰伦</em> (Jay Chou)\\n 词:方文山\\n 曲:<em>周杰伦</em>\\n 天涯的尽头是风沙\\n 红尘的故事叫牵挂\\n 封刀隐没在寻常人家 东篱下\\n 闲云野鹤古刹\\n 快马在江湖里厮杀\\n 无非是名跟利放不下\\n 心中有江山的人岂能快意潇洒\\n 我只求与你共华发\\n 剑出鞘恩怨了 谁笑\\n 我只求今朝拥你 入怀抱\\n 红尘客栈风似刀 骤雨落宿命敲\\n 任武林谁领风骚\\n 我却只为你折腰\\n 过荒村野桥寻世外古道\\n 远离人间尘嚣\\n 柳絮飘执子之手逍遥\\n 檐下窗棂斜映枝桠\\n 与你席地对座饮茶\\n 我以工笔画将你牢牢的记下\\n 提笔不为风雅\\n 灯下叹红颜近晚霞\\n 我说缘份一如参禅不说话\\n 你泪如梨花洒满了纸上的天下\\n 爱恨如写意山水画\\n 剑出鞘恩怨了 谁笑\\n 我只求今朝拥你入怀抱\\n 红尘客栈风似刀 骤雨落宿命敲\\n 任武林谁领风骚\\n 我却只为你折腰\\n 过荒村野桥寻世外古道\\n 远离人间尘嚣\\n 柳絮飘执子之手逍

它返回的结果的前面一部分,不是 json 格式的,但后面一部分又是 json 格式的。所以,我们要先解析出 json 格式的那部分结果。

def parseLyric(self, response):
    # 由于其返回的结果为字符串,而且不是 json 格式的,我们还有进一步解析
    lyric = (response.body.decode('UTF-8'))
    # 解析 json 格式部分的结果
    first = lyric.find('(') + 1
    last = lyric.rfind(')')
    lyric = lyric[first:last]
    import json
    from datetime import datetime
    json_lyric = json.loads(lyric)
    for song in json_lyric['data']['lyric']['list']:
        # 解析歌曲
        print('专辑名称:' + song['albumname'])
        ts = int(song['pubtime'])
        pubtime = datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
        print('发行时间:' + pubtime)
        print('歌名:' + song['songname'])
        singers = ''
        for singer in song['singer']:
            singers += singer['name']
        print('歌手:' + singers)
        print(song['lyric'].replace('<em>', '').replace('</em>', ''))
        content = song['content'].replace('<em>', '').replace('</em>', '')
        print('歌词:' + content)
        print('================================================')
        # 将歌词写进 txt 文本
        filename = 'lyric/' + song['songname'] + "-" + pubtime + '.txt'
        with open(filename, 'w') as file_to_w:
            file_to_w.write(content.replace("\\n", '\r\n'))

瞎比比

感叹一句:重新写文章真是爽!!这里只给出了分析歌词的源码,在 GitHub 中,我还写了分析专辑的代码,详见 GitHub。后台回复「杰伦歌词」,获取杰伦的所有歌词。回复「杰伦源码」,获取源码。

真给力,字节跳动年度首发《音视频开发进阶指南》限时领取,理论与实战齐飞 音视频播放:音视频同步音视频解封和封装:生成一个MP4。 阅读详情

相关推荐

Windows本地化部署Dify完整指南

本文详细介绍了在Windows系统上本地化部署Dify的完整步骤,涵盖了Docker Desktop的安装与配置、Dify源代码的获取、环境变量的设置、服务的启动与管理、以及常见问题的解决方案。文章首先指导用户如何下载和安装Docker Desktop,并配置WSL 2功能。接着,详细说明了如何获取Dify源代码,并通过Docker Compose启动服务。文章还提供了高级配置指南,包括如何配置大语言模型和更新Dify版本。最后,针对Docker镜像拉取失败等常见问题,提供了详细的诊断和解决方案。通过本文,

jacky_zhuyuanlu的博客 1万+

01_urllib

1、urllib的简单使用 import urllib.request #(1)定义一个url 就是要访问的地址 url = 'http://www.baidu.com' #(2) 模拟浏览器向服务器发送请求 response 响应 response = urllib.request.urlopen(url) #(3) 获取响应中的页面的源码 content内容的意思 # read方法 返回的是字节形式的二进制数据(b开头) #我们要将二进制的数据转换为字符串 二进制 ——> 字符串 解码

weixin_43363236的博客 1万+

LTSPICE仿真电路:(二十八)三极管厄利电压与输出特性曲线深度解析

本文深入解析了LTSPICE仿真电路中三极管的厄利电压与输出特性曲线,详细介绍了厄利电压的物理意义、仿真设置及实际应用。通过伏安特性曲线和厄利电压的分析,帮助读者理解三极管放大性能的关键参数,并提供了电路设计中的优化方案和故障排查技巧。

weixin_26899659的博客 149

【python爬虫 系列 最终篇】16.利用多线程多进程爬取qq音乐全站所有信息和音乐

实战 爬取qq音乐 1.项目详情 歌手分区:(a-#) 整个爬虫项目按功能分为爬虫规则和数据入库,分别对应文件 music.py 和 music_db.py。 爬虫规则大致如下: 在歌手列表(https://y.qq.com/portal/singer_list.html)中按照字母类别对歌手进行分类,遍历每个分类下的每位歌手页面,然后获取每位歌手页面下的全部歌曲信息。根据该设计方案列出遍历...

AI_LINNGLONG的博客 1万+

告别手动点鼠标:用Python脚本批量跑ADS版图仿真,效率提升10倍(附完整代码)

本文详细介绍了如何利用Python脚本自动化ADS版图仿真流程,显著提升射频工程师的工作效率。通过调用ADS底层接口,实现参数化修改、批量任务调度和结果自动收集,解决了手动操作中的常见问题,如仿真不更新等。附完整代码,帮助开发者快速实现10倍效率提升。

weixin_42523543的博客 331

Kaggle | 总奖池超200万美金的数学竞赛AIMO2冠军方案

••••结论1:通过结合高质量大规模数据集、工具集成推理和生成式选择方法,可以构建在挑战性数学问题上达到最先进水平的语言模型。本文的方法在 AIMO-2 竞赛中的胜利以及在多个数学基准上的 SOTA 结果验证了这一策略的有效性。结论2:发布 OpenMathReasoning 数据集、OpenMath-Nemotron 模型和代码是社区的宝贵财富。

hxshine的博客 1194

python 爬虫代码

python 爬虫代码

qq_42740465的博客 3万+

数据结构之栈(Stack)的实现详解

堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。

swadian2008的博客 3813

python---爬取QQ音乐

本文仅用作学习记录和交流。

SRestia的博客 1万+

24年电赛H题 | 想要小车走直线,正在调角度环,但不知道怎么把角度偏航角偏差转化成电机速度输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1313

YOLOv13多分支融合机制+SE注意机制 RepVGGBlock_OREPA架构 map提升4.89,召回率提升8.66

本文提出了一种改进的YOLOv13目标检测模型,通过引入RepVGGOREPA模块和重参数化技术,显著提升了模型性能。实验结果表明,采用RepVGGBlock后,mAP提升4.89,召回率提升8.66%。文章详细介绍了模型移植过程,包括创建YOLOv13-REPVGGOREPA配置文件、修改任务处理代码和模块初始化文件,并提供了完整的OREPA模块实现代码。该模块通过多尺度特征融合和SE注意力机制,实现了训练时的丰富表征能力和推理时的高效计算,为YOLO系列模型提供了新的优化思路。

FJN110的博客 2650

Python爬虫QQ音乐数据采取,公开数据获取案例之一

工具准备 数据来源: QQ音乐 开发环境:win10、python3.7 开发工具:pycharm、Chrome 效果展示 项目思路解析 搜索你需要的歌名或者歌曲 抓取对应的数据包 提取json数据里的歌曲名字,歌曲的mid,歌手名字 for i in range(1, 10): url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp' params = { "ct": " 24", "qqmu

五包辣条的博客 3867

PCL 点云八叉树射线相交

PCL 点云八叉树射线相交

dayuhaitang1的博客 850

scrapy遇上ajax,抓取QQ音乐周杰伦专辑与歌词

目录序言分析网页分析请求代码实现瞎比比序言好久没写原创文章,早就手痒痒了,所以挤出时间写了这篇,这是下面这五篇文章的连载文章:爬虫利器初体验(1)听说你的爬虫又被封了?(...

罗罗攀 560

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

scrapy 也能爬取妹子图?(5)

爬虫利器初体验(1) 听说你的爬虫又被封了?(2) 爬取数据不保存,就是耍流氓(3) 爬取两万多租房数据,告诉你广州房租现状(4) scrapy 也能爬取妹子图?(5) scrapy遇上ajax,抓取QQ音乐周杰伦专辑与歌词(6) 目录 前言 Media Pipeline 启用Media Pipeline 使用 ImgPipeline 抓取妹子图 瞎比比 前言 我们在抓取数据的过程中,除了要抓...

weixin_33929309的博客 108

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

反爬虫系列-JS参数篇(1)

目录瞎比比举个栗子?开始分析寒假作业又瞎比比瞎比比之前写了《scrapy遇上ajax,抓取QQ音乐周杰伦专辑与歌词(6)》这篇文章,其中有些参数,如果不查看其 JS 代码,是无法知道它是怎么来的。说到这里,我们来看看啥是反爬虫?...

clf76235的博客 246

爬取两万多数据,告诉你广州房租价格现状(4)

爬虫利器初体验(1) 听说你的爬虫又被封了?(2) 爬取数据不保存,就是耍流氓(3) 爬取两万多租房数据,告诉你广州房租现状(4) scrapy 也能爬取妹子图?(5) scrapy遇上ajax,抓取QQ音乐周杰伦专辑与歌词(6) 概述 前言 统计结果 爬虫代码实现 爬虫分析实现 后记 前言 八月份的时候,由于脑洞大开,决定用 python 爬虫爬取了深圳的租房数据,并写了文章《用Python...

weixin_33923148的博客 150

Python爬虫 从小白到高手 各种最新案例! Urllib Xpath JsonPath BeautifulSoup

本教程适合想掌握爬虫技术的学习者,以企业主流版本Python 3.7来讲解,内容包括:Python基础、Urllib、解析(xpath、jsonpath、beautiful)、requests、selenium、Scrapy框架等。针对零基础的同学可以从头学起,有Python基础的同学建议直接从第52集开始学习爬虫部分视频。教程中示例多种网站的爬取,包括设计类网站、招聘类网站、图书类网站、图片素材类网站等,还讲解了验证码的破解和常见的打码平台使用

我亦无他,唯手熟尔 8239

Python应用爬虫下载QQ音乐歌曲!

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970。

Python_trys的博客 6507
上一篇: zone 的 2018 年终总结
下一篇: 反爬虫系列-JS参数篇(1)
zone7_
博客等级 码龄10年 144粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值