Python3应用requests包开发定向爬虫

最近学院给我们开设了Python+爬虫课程,请来了外面的公司的老师来给我们进行了为期10天的爬虫课程,实训的日子最近结束,我也有时间把我们平常写的拿来回顾一下写写博客。这个聚焦爬虫可以用来爬取QQ音乐web端指定歌手的音乐(客户端需要vip才能听的也可以爬),大家喜欢的可以多点赞(手动狗头)。接下来上代码和讲解:
这个爬虫采用了面向对象的思想,运用requests包和json包,从QQ音乐web端爬取指定歌手的音乐并以.m4a形式下载到本地。QQ音乐web端采用异步请求获取音乐文件,所以不能直接从看到的那个页面的链接爬取。

打开开发者工具,在network里刷新,找到真正的传来音乐文件响应(有时候很难找…),复制他的链接(在这里是一个client_search的链接),包括参数(很重要,有时候没这些参数是请求不到数据的)。

class QQMusic:def __init__(self, singer):self.singer = singerself.tmp_singer_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=58393477745290472&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=' + self.singer + '&g_tk=5381&loginUin=249099&hostUin=0&platform=yqq.json&needNewCode=0'self.guid = "3481851020"self.headers = {"Referer": "https://y.qq.com/portal/player.html","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"}

类的初始化函数,用来定义请求头和一些必要的参数和请求头信息,没有这些很可能取不到,或者被识别为爬虫。

# 获取歌手名def get_singer_url(self):return self.tmp_singer_url# 利用歌曲id获取歌曲链接def get_music_url(self, songmid):return 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"' + self.guid + '","songmid":["' + songmid + '"],"songtype":[0],"uin":"27281729","loginflag":1,"platform":"20"}},"comm":{"uin":"27281729","format":"json","ct":24,"cv":0}}'# 获取指定url的响应内容def parse_url(self, url):response = requests.get(url, headers=self.headers)return response.content# 从响应内容获取歌曲的列表def get_song_url(self, content):song_dict = json.loads(content.decode())sip = song_dict["req_0"]["data"]["sip"][0] # http://ws.stream.qqmusic.qq.com/purl = song_dict["req_0"]["data"]["midurlinfo"][0]["purl"]url = sip + purlfilename = song_dict["req_0"]["data"]["midurlinfo"][0]["filename"]return url, filename# 将音乐的url响应的内容通过二进制输出到文件中def write_song_to_file(self, content, filename):with open(filename, "wb") as f:f.write(content)print(filename + "保存成功")# 获取歌曲列表def get_song_list(self, content):json_str = content.decode()song_dict = json.loads(json_str[9:-1])song_list = song_dict["data"]["song"]["list"]new_song_list = [ {"title": song["title"], "songmid": song["mid"]} for song in song_list]return new_song_listdef run(self):# 获取歌手的url地址singer_url = self.get_singer_url()# 发送请求获取歌手的歌曲的列表singer_content = self.parse_url(singer_url)print(singer_content)# 解析歌手的歌曲列表song_list = self.get_song_list(singer_content)# 遍历歌曲列表,对每首歌进行操作for song in song_list:# 循环遍历歌手的歌曲列表,下载歌曲# 发送请求获取歌曲的下载地址# 获取初始化的url地址url = self.get_music_url(song["songmid"])# 发送请求获取响应content = self.parse_url(url)# 处理响应数据,获取歌曲的下载地址song_url, filename = self.get_song_url(content)filename = song["title"] + ".m4a"# 发送请求下载歌曲song_content = self.parse_url(song_url)# 保存到文件中self.write_song_to_file(song_content, filename)

这里的注释说的很清楚了,核心的方法是run,获取你相查的歌手的歌曲列表url,然后for循环每一首歌,获取歌曲文件的url,访问获得文件并以二进制输出到本地。
比如:

import jsonimport requestsclass QQMusic:def __init__(self, singer):self.singer = singerself.tmp_singer_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=58393477745290472&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=' + self.singer + '&g_tk=5381&loginUin=249099&hostUin=0&platform=yqq.json&needNewCode=0'self.guid = "3481851020"self.headers = {"Referer": "https://y.qq.com/portal/player.html","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"}# 获取歌手名def get_singer_url(self):return self.tmp_singer_url# 利用歌曲id获取歌曲链接def get_music_url(self, songmid):return 'https://u.y.qq.com/cgi-bin/musicu.fcg?data={"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"' + self.guid + '","songmid":["' + songmid + '"],"songtype":[0],"uin":"27281729","loginflag":1,"platform":"20"}},"comm":{"uin":"27281729","format":"json","ct":24,"cv":0}}'# 获取指定url的响应内容def parse_url(self, url):response = requests.get(url, headers=self.headers)return response.content# 从响应内容获取歌曲的列表def get_song_url(self, content):song_dict = json.loads(content.decode())sip = song_dict["req_0"]["data"]["sip"][0] # http://ws.stream.qqmusic.qq.com/purl = song_dict["req_0"]["data"]["midurlinfo"][0]["purl"]url = sip + purlfilename = song_dict["req_0"]["data"]["midurlinfo"][0]["filename"]return url, filename# 将音乐的url响应的内容通过二进制输出到文件中def write_song_to_file(self, content, filename):with open(filename, "wb") as f:f.write(content)print(filename + "保存成功")# 获取歌曲列表def get_song_list(self, content):json_str = content.decode()song_dict = json.loads(json_str[9:-1])song_list = song_dict["data"]["song"]["list"]new_song_list = [ {"title": song["title"], "songmid": song["mid"]} for song in song_list]return new_song_listdef run(self):# 获取歌手的url地址singer_url = self.get_singer_url()# 发送请求获取歌手的歌曲的列表singer_content = self.parse_url(singer_url)print(singer_content)# 解析歌手的歌曲列表song_list = self.get_song_list(singer_content)# 遍历歌曲列表,对每首歌进行操作for song in song_list:# 循环遍历歌手的歌曲列表,下载歌曲# 发送请求获取歌曲的下载地址# 获取初始化的url地址url = self.get_music_url(song["songmid"])# 发送请求获取响应content = self.parse_url(url)# 处理响应数据,获取歌曲的下载地址song_url, filename = self.get_song_url(content)filename = song["title"] + ".m4a"# 发送请求下载歌曲song_content = self.parse_url(song_url)# 保存到文件中self.write_song_to_file(song_content, filename)if __name__ == '__main__':singer = "李荣浩"qqmusic = QQMusic(singer)qqmusic.run()




这样就爬到音乐了!请各位观众老爷给个赞?吧!!

Python3运用requests包爬取QQ音乐指定歌手歌曲相关推荐

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

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

  2. python爬取音乐并保存的格式_python爬取QQ音乐歌单歌曲保存到本地,json解析

    序:python强大的功能,可以爬取网上的某些信息,本次主要是通过爬歌单信息熟悉下python基础. 用到知识点: 1.python3.urllib.request.openurl 2.json (j ...

  3. python爬取音乐并保存_python爬取QQ音乐歌单歌曲保存到本地,json解析

    序:python强大的功能,可以爬取网上的某些信息,本次主要是通过爬歌单信息熟悉下python基础. 用到知识点: 1.python3.urllib.request.openurl 2.json (j ...

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

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

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

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

  6. 使用selenium操控浏览器爬取QQ音乐

    环境python3.6,工具pycharm 首先安装selenium框架,下载selenium框架需要的webdriver驱动放在谷歌浏览器bin目录- 一.webdriver的安装 1.下载地址: ...

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

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

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

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

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

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

最新文章

  1. python使用numpy中的np.mean函数计算数组的均值、np.var函数计算数据的方差、np.std函数计算数组的标准差
  2. 宏定义中的#、##操作符和... 、 _ _VA_ARGS_ _解析
  3. 交叉编译并移植opencv3.0.0到arm板
  4. SpringSecurity权限控制之异常处理方式三
  5. Spark入门(一)单主standalone安装
  6. MacOS安装pip失败,提示:SyntaxError: invalid syntax
  7. javax.validation.ValidationException: Unable to find a default provider
  8. AIoT时代的新思维
  9. 风靡朋友圈的HTML5游戏去哪了
  10. Seeing that the girl he likes actually married his third uncle
  11. 关于LINUX权限的一个题目
  12. c# winform 显示动态gif图片的简单方法
  13. 图片标注工具Labelme使用
  14. A公司物流配送安全风险管理现状
  15. 【C++】VS中读写操作(fclose.cpp)引发中断——将一个无效参数传递给了将无效参数视为严重错误的函数
  16. 请教ip routing指令与no switchport区别?
  17. 新手如何做自媒体赚钱?天天看头条却不赚钱,这份资料对你有启发
  18. base-package 详解
  19. 开发微领地小蜜系统APP平台
  20. python中sleep的用法_Python sleep 用法 原

热门文章

  1. linux获取cpu核心数c语言接口
  2. LaTex, 矩阵方程插入 和图片表格以及公式跨栏插入
  3. 如何给自己的小程序起个好名字
  4. java适合内向的人吗_小猿圈之性格内向适合做Java程序员吗
  5. 什么是页缓存(Page Cache)(转载)
  6. [爬虫] 爬取高德地图的面状数据存为shp - 公园数据为例
  7. Winxp下用Virtualbox安装Mac(雪豹)系统
  8. 《OCCLUSION-AWARE GAN FOR FACE DE-OCCLUSION IN THE WILD 》
  9. Occlusion Aware Facial Expression RecognitionUsing CNN With Attention Mechanism阅读笔记
  10. centos 7 卸载 mariadb