这次抓取的为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音乐到本地...相关推荐

  1. html元素不让蜘蛛抓取,屏蔽网站后台禁止搜索引擎蜘蛛抓取的方法

    搜索引擎爬取网页内容的工具我们都称之为搜索引擎蜘蛛,如果希望屏蔽蜘蛛抓取某个页面到搜索引擎服务器中,可以通过robots.txt文件来限制蜘蛛抓取.很多朋友希望屏蔽网站后台禁止搜索引擎蜘蛛抓取,又不希 ...

  2. python爬取小说网站资源_利用python的requests和BeautifulSoup库爬取小说网站内容

    1. 什么是Requests?html Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库.python 它比urlli ...

  3. python爬知识星球付费数据_用python爬取知识星球

    去年我们做过一个叫「学长问答」的社群活动,里面沉淀了大量有价值的互动信息,后来因为各种原因终止了.今天和涂腾聊起来,觉得这些信息就这么沉寂了太浪费.所以就试着用python爬取了知识星球的内容. 这个 ...

  4. python获取app信息的库_基于python3抓取pinpoint应用信息入库

    这篇文章主要介绍了基于python3抓取pinpoint应用信息入库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pinpoint是用Java编写 ...

  5. python获取渲染之后的网页_使用Pyppeteer抓取渲染网页

    Pyppeteer是Puppeteer的非官方Python支持,Puppeteer是一个无头JavaScript的基于Chrome/Chromium浏览器自动化库,可以用于对渲染网页的抓取. 比较了P ...

  6. python爬今日头条组图_(python爬虫之)ajax解析爬取今日头条组图并下载

    首先吐槽一波csdn配色真直男,囧 此次任务需要注意的是: 用request.get方法的时候要加cookie, 网页源代码也改动了,详情页进入后不是一个json数据包,是一个html文档. 以及其它 ...

  7. GmBox – 支持批量下载谷歌音乐MP3的客户端 (免费开源支持Windows、Linux与Mac)

    谷歌音乐对于国人来说绝对是一个伟大的服务,它不仅所有MP3都是合法版权,而且还完全免费开放给大家下载.之前我们介绍过一款 谷歌音乐盒 的PC客户端,可以比网页版更方便地试听与下载正版音乐,可惜它只能在 ...

  8. python爬人人贷代码视频_【IT专家】人人贷网的数据爬取(利用python包selenium)

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 人人贷网的数据爬取(利用 python 包 selenium ) 2016/12/31 0 记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合 ...

  9. python爬取数据案例分析_基于Python及webdriver的网页抓取案例

    上次有朋友问怎么抓取交易所网站的数据,特别是历史数据,这里特别推荐使用selenium这一自动化测试框架. 原本selenium是用来完成大量基于浏览器的自动化测试的,但由于可以方便地执行JS代码,摸 ...

  10. python百度贴吧怎么爬取最早的帖子_【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码...

    开门见山. 懒癌一犯,能拖一天是一天. 好了,亲爱的小伙伴们,我又回来了!今天带来的是抓取输入的任意贴吧,抓取指定范围页数内的源代码. 工具: 依旧是 PyCharm 和 Google 浏览器,pyt ...

最新文章

  1. ASP.NET2.0 永恒密码之戒【月儿原创】
  2. 为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法
  3. CentOS6下编译安装zabbix_agent3.0客户端
  4. 19-spring学习-springMVC环境配置
  5. 平庸开发者的生存指南
  6. Could not load java.net.BindException错误解决
  7. 人机交互,加速机器人拟人化
  8. 从源码解析LinkedList集合
  9. mongo(删除操作)
  10. Visio画出的图,裁剪成固定大小再添加马赛克的方法
  11. 秋招内推码汇总第二波 | 阿里、科大讯飞等10家公司内推码
  12. arcgis数据量大显示慢_百万量级矢量数据加载对比实验,Arcgis VS LSV专业版
  13. 【TypeError: Descriptors cannot not be created directly. 】解决方法
  14. 浅析信号与系统1(指数信号与正弦信号)
  15. JavaScript 时间范围
  16. Java 后端开发学习型网站汇总
  17. AD转换器输入之前为何要接一个电压跟随器?
  18. 1504 Word Rings
  19. DRIVE ES 5.5 SP5 安装在win10下的教程
  20. 老路用得上的商学课-1-20学习(读书)笔记

热门文章

  1. OutLook使用技巧
  2. DMA三种方式以及DMA特点
  3. uni-app:搜索关键词并高亮显示,可重复显示
  4. 网络电视广告屏蔽教程
  5. 个人java课设的心得体会收获_java课程设计心得体会
  6. 加州欧文大学计算机申请,加州大学欧文分校申请
  7. 网站换服务器步骤,【大拿分享】六个步骤搞定更换网站服务器
  8. 电脑PPTP更换IP教程
  9. python实时监听微博发文同步到微信
  10. python IMAP4命令详解