python爬取音乐网站排行榜_使用Python抓取Web端QQ音乐排行榜 批量下载QQ音乐到本地...
这次抓取的为QQ音乐排行榜,我们通过浏览器抓包,直接找m4a文件,这个是音乐文件:
QQ音乐这个url下载地址需要一个参数vkey,然后还需要构造URL,观察URL发现,基本每个url都是以http://isure.stream.qqmusic.qq.com/C400开头,后面的值可以在这个页面找到:
那么现在就剩vkey这个参数了。通过浏览器不断的刷新请求观察发现,vkey参数存在于js文件中,我们可以使用json格式工具查看一下,是否有我们寻找的vkey。
json格式工具推荐:http://www.bejson.com
这里略过寻找的步骤,在以:https://u.y.qq.com/cgi-bin/musicu.fcg?callback,这个url开头的plain文件中找到了vkey的存在,那么现在就是如何构造这个url请求,还需要知道这个url的参数,观察参数变化的有data和jsonpCallback,callback是变化的,data里面变化的就是songmid,就是我们前面找出来C400后面的参数。参考代码:
import requests,json,re,os
from lxml import etree
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
class QQMusic():
def __init__(self):
self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
}
self.url='https://y.qq.com/n/yqq/toplist/4.html'
def down_music(self,c4,music_name):
"""
参数不是固定的,可根据自身情况粘贴浏览器中的参数音乐播放页面:https://u.y.qq.com/cgi-bin/musicu.fcg?
songmid最重要
:param c4:
:param music_name:
:return:
"""
self.data=json.dumps({"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"2891348329","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"2891348329","songmid":[c4],"songtype":[0],"uin":"1552797557","loginflag":1,"platform":"20"}},"comm":{"uin":1552797557,"format":"json","ct":24,"cv":0}})
self.params={
"callback":"getplaysongvkey6354954596402418",
"g_tk":"1368429410",
"jsonpCallback":"getplaysongvkey6354954596402418",
"loginUin":"1552797557",
"hostUin":"0",
"format":"jsonp",
"inCharset":"utf8",
"outCharset":"utf-8",
"notice":"0",
"platform":"yqq",
"needNewCode":"0",
"data":self.data
}
url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?'
try:
html = requests.get(url,headers=self.headers,params=self.params)
# html.text开始的参数我们需要提取出来,不然会报错,转不了json字典格式的
s = re.compile('.*?\((.*?)\)', re.S)
data = re.findall(s, html.text)[0]
music = json.loads(data)
purl = music['req_0']['data']['midurlinfo'][0]['purl']
down_url = f'http://111.6.166.23/amobile.music.tc.qq.com/{purl}'
# print(down_url)
self.download(down_url,music_name)
except Exception as e:
return None
def download(self,down_url,music_name):
print('正在下载歌曲:%s' % music_name)
file_path = '{0}/{1}.{2}'.format(os.getcwd(), music_name, 'm4a')
if not os.path.exists(file_path):
with open(file_path, 'wb') as f:
f.write(requests.get(down_url).content)
def get_music(self):
"""
提取所有的排行榜页面
:return: 排行榜url
"""
try:
html=requests.get(self.url,self.headers).content
tree=etree.HTML(html)
for i in tree.xpath('//dd[@class="toplist_nav__item"]'):
href='https:'+i.xpath('./a/@href')[0]
yield href
except Exception as e:
return None
def get_detail(self,url):
"""
由于排行榜页面的数据没有在源代码中,所以使用selenium获取
:param url:
:return:
"""
# option = webdriver.ChromeOptions()
# option.add_argument('headless')
# driver = webdriver.Chrome(options=option)
try:
option = webdriver.FirefoxOptions() # 设置首选项,无头浏览器,就是看不到浏览器的操作,后台进行
option.add_argument('-headless') #火狐无头模式
driver =webdriver.Firefox(options=option) #这里使用火狐浏览器
driver.get(url)
# 等待所有的class="songlist__songname_txt"都加载出来,这个是歌曲的名字
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "songlist__songname_txt")))
# 然后我们提取这个歌曲的相关属性,C400
lis = driver.find_elements_by_class_name('songlist__songname_txt')
#href="https://y.qq.com/n/yqq/song/000OjsEW0QrPAd.html"
pattern = re.compile(r'https://y.qq.com/n/yqq/song/(.*?).html') #通过正则提取C400后面的值
for i in range(lis.__len__()):
li = lis.__getitem__(i)
# 找到class="js_song",这个才是我们需要的
a = li.find_element_by_class_name('js_song')
href = a.get_attribute('href')
music_name = a.get_attribute('title')
c4 = re.match(pattern, href).group(1)
yield c4,music_name
except TimeoutException as e:
return None
def start(self):
for url in self.get_music():
for k,v in self.get_detail(url):
self.down_music(k, v)
if __name__=='__main__':
qq=QQMusic()
qq.start()
音乐保存在当前目录下,可以自行修改,参数也不是固定的可能随时都会失效,同样参数的位置我们已经找到了,就没什么难度了。使用的是selenium抓取排行榜的歌曲信息,比较慢,可以借鉴修改一下。
未经允许不得转载:作者:鳄鱼君,
转载或复制请以 超链接形式 并注明出处 鳄鱼君。
python爬取音乐网站排行榜_使用Python抓取Web端QQ音乐排行榜 批量下载QQ音乐到本地...相关推荐
- html元素不让蜘蛛抓取,屏蔽网站后台禁止搜索引擎蜘蛛抓取的方法
搜索引擎爬取网页内容的工具我们都称之为搜索引擎蜘蛛,如果希望屏蔽蜘蛛抓取某个页面到搜索引擎服务器中,可以通过robots.txt文件来限制蜘蛛抓取.很多朋友希望屏蔽网站后台禁止搜索引擎蜘蛛抓取,又不希 ...
- python爬取小说网站资源_利用python的requests和BeautifulSoup库爬取小说网站内容
1. 什么是Requests?html Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库.python 它比urlli ...
- python爬知识星球付费数据_用python爬取知识星球
去年我们做过一个叫「学长问答」的社群活动,里面沉淀了大量有价值的互动信息,后来因为各种原因终止了.今天和涂腾聊起来,觉得这些信息就这么沉寂了太浪费.所以就试着用python爬取了知识星球的内容. 这个 ...
- python获取app信息的库_基于python3抓取pinpoint应用信息入库
这篇文章主要介绍了基于python3抓取pinpoint应用信息入库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pinpoint是用Java编写 ...
- python获取渲染之后的网页_使用Pyppeteer抓取渲染网页
Pyppeteer是Puppeteer的非官方Python支持,Puppeteer是一个无头JavaScript的基于Chrome/Chromium浏览器自动化库,可以用于对渲染网页的抓取. 比较了P ...
- python爬今日头条组图_(python爬虫之)ajax解析爬取今日头条组图并下载
首先吐槽一波csdn配色真直男,囧 此次任务需要注意的是: 用request.get方法的时候要加cookie, 网页源代码也改动了,详情页进入后不是一个json数据包,是一个html文档. 以及其它 ...
- GmBox – 支持批量下载谷歌音乐MP3的客户端 (免费开源支持Windows、Linux与Mac)
谷歌音乐对于国人来说绝对是一个伟大的服务,它不仅所有MP3都是合法版权,而且还完全免费开放给大家下载.之前我们介绍过一款 谷歌音乐盒 的PC客户端,可以比网页版更方便地试听与下载正版音乐,可惜它只能在 ...
- python爬人人贷代码视频_【IT专家】人人贷网的数据爬取(利用python包selenium)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系 人人贷网的数据爬取(利用 python 包 selenium ) 2016/12/31 0 记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合 ...
- python爬取数据案例分析_基于Python及webdriver的网页抓取案例
上次有朋友问怎么抓取交易所网站的数据,特别是历史数据,这里特别推荐使用selenium这一自动化测试框架. 原本selenium是用来完成大量基于浏览器的自动化测试的,但由于可以方便地执行JS代码,摸 ...
- python百度贴吧怎么爬取最早的帖子_【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码...
开门见山. 懒癌一犯,能拖一天是一天. 好了,亲爱的小伙伴们,我又回来了!今天带来的是抓取输入的任意贴吧,抓取指定范围页数内的源代码. 工具: 依旧是 PyCharm 和 Google 浏览器,pyt ...
最新文章
- ASP.NET2.0 永恒密码之戒【月儿原创】
- 为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法
- CentOS6下编译安装zabbix_agent3.0客户端
- 19-spring学习-springMVC环境配置
- 平庸开发者的生存指南
- Could not load java.net.BindException错误解决
- 人机交互,加速机器人拟人化
- 从源码解析LinkedList集合
- mongo(删除操作)
- Visio画出的图,裁剪成固定大小再添加马赛克的方法
- 秋招内推码汇总第二波 | 阿里、科大讯飞等10家公司内推码
- arcgis数据量大显示慢_百万量级矢量数据加载对比实验,Arcgis VS LSV专业版
- 【TypeError: Descriptors cannot not be created directly. 】解决方法
- 浅析信号与系统1(指数信号与正弦信号)
- JavaScript 时间范围
- Java 后端开发学习型网站汇总
- AD转换器输入之前为何要接一个电压跟随器?
- 1504 Word Rings
- DRIVE ES 5.5 SP5 安装在win10下的教程
- 老路用得上的商学课-1-20学习(读书)笔记