Python实例---爬取下载喜马拉雅音频文件
PyCharm下python爬虫准备
打开pycharm
点击设置
点击项目解释器,再点击右边+号
搜索相关库并添加,例如:requests
喜马拉雅全网递归下载
打开谷歌/火狐浏览器,按F12打开开发者工具—>选择【网络】
编辑器浏览器输入: https://www.ximalaya.com/yinyue/ 点击【摇滚】
发现弹出新的URL:https://www.ximalaya.com/yinyue/yaogun/ [汉字转换拼音后的URL访问]
点击进入任意一个专辑[未播放]
点击播放音乐[播放中]
[是一个json格式的URL]访问搜索界面的源代码,查找albumId,通过这些albumid获取音频文件的url
https://www.ximalaya.com/revision/play/album?albumId=16372952&pageNum=1&sort=-1&pageSize=30
最后使用函数urllib.request.urlretrieve()下载音乐即可
附源码:
import re import os import json import requests import urllib from urllib import request from pypinyin import lazy_pinyin class XimaLaya(object): # 模拟浏览器操作 def __init__(self): self.header = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0' } # 第一步: 根据输入的汉字转换为拼音 def han_pinyin(self, hanzi): pin = lazy_pinyin(hanzi) # 汉转拼音 pin = "".join(pin) # 去除空格 return pin # 返回拼音 # 第二步: 根据REST格式去访问喜马拉雅,获取页面的HTML def getHtml(self, pinyin): url = 'https://www.ximalaya.com/yinyue/' + pinyin print("访问的网站是: " + url) html = requests.get(url, headers=self.header) # apparent_encoding通过调用chardet.detect()来识别文本编码,有些消耗计算资源 html.encoding = html.apparent_encoding # html.encoding = 'utf8' --> 直接改为UTF8也行 with open('D:\XiMaLaya\html\\' + str(pinyin + '.html'), 'a', encoding='utf-8') as f: f.write(html.text) return html # 第三步:根据页面的内容获取对应歌单的albumId的值 def getAlbumId(self, html): albumIdAll = re.findall(r'"albumId":(.*)', (html).text) # 利用正则进行匹配,获取专辑ID print("专辑信息", albumIdAll) with open('D:\XiMaLaya\\albumIdAll\\' + str('albumIdAll.txt'), 'a', encoding='utf-8') as f: for x in albumIdAll: f.write(str(x)) myList = [] url3 = [] for i in (albumIdAll[:1]): # 获取对应专辑ID的首页 url2 = 'https://www.ximalaya.com/revision/play/album?albumId=' + i print(url2) # 进入对应专辑ID的首页信息 html2 = requests.get(url2.split(',')[0], headers=self.header) # 含有下载URL的集合 # src "http://audio.xmcdn.com/group12/M03/2C/AA/wKgDW1WJ7GqxuItqAB8e1LXvuds895.m4a" url3 = (re.findall(r'"src":"(.*?)"', (html2).text)) # 记录信息用的 myList.append('获取对应专辑ID的首页\r\n' + url2 + '\n---------------------------------------') myList.append('含有下载URL的集合\r\n' + html2.text + '\n---------------------------------------') myList.append('下载专辑的URL集合\r\n' + str(url3) + '\n---------------------------------------') with open('D:\XiMaLaya\\albumIdAll\\' + str('hhh.txt'), 'a', encoding='utf-8') as f: f.write(json.dumps(myList)) print('done') return url3 # 下载专辑的URL集合 # 第四步: 获取专辑名 def getTitle(self, html): t = re.findall(r'"title":"(.*?)"', (html).text) # 获取titile(歌名)的值 with open('D:\XiMaLaya\\albumIdAll\\' + str('albumId_Name.txt'), 'a', encoding='utf-8') as f: f.write(str(t)) return t # 第五步: 下载歌曲 def downLoad(self, url, title): n = 0 for i in url: try: urllib.request.urlretrieve(i, 'D:\XiMaLaya\\'+str(title[n]+'.m4a')) print(str(title[n]), '...【下载成功】') n = n + 1 except: print(str(title[n]) + "...【下载失败】") if __name__ == '__main__': fm = XimaLaya() # 输入需要下载的歌曲类型 str1 = fm.han_pinyin("摇滚") # 获取对应歌曲类型的首页信息 html = fm.getHtml(str1) # 获取歌曲类型的首页里面的专辑名称 title = fm.getTitle(html) # 获取歌曲类型的首页里面的专辑ID url3 = fm.getAlbumId(html) # 下载对应曲目 fm.downLoad(url3, title)
喜马拉雅单一专辑的下载
打开谷歌/火狐浏览器,按F12打开开发者工具—>选择【网络】
编辑器浏览器输入: https://www.ximalaya.com/yinyue/12521114/
点击计入音乐[未播放前]
点击进入音乐[播放中]
[是一个json格式的URL]访问搜索界面的源代码,查找albumId,通过这些albumid获取音频文件的url
https://www.ximalaya.com/revision/play/album?albumId=12521114&pageNum=1&sort=-1&pageSize=30
最后使用函数urllib.request.urlretrieve()下载音乐即可
附源码:
import re import json import requests import urllib from urllib import request class XimaLaya(object): # 模拟浏览器操作 def __init__(self): self.header = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0' } # 第一步:根据REST格式去访问喜马拉雅,获取页面的HTML def getHtml(self, pinyin): url = 'https://www.ximalaya.com/yinyue/' + pinyin print("访问的网站是: " + url) html = requests.get(url, headers=self.header) # apparent_encoding通过调用chardet.detect()来识别文本编码,有些消耗计算资源 html.encoding = html.apparent_encoding # html.encoding = 'utf8' --> 直接改为UTF8也行 print(html) return html # 第二步:根据页面的内容获取对应歌单的albumId的值 def getAlbumId(self, html): albumIdAll = re.findall(r'"albumId":(.*)', (html).text) # 利用正则进行匹配,获取专辑ID print("专辑信息", albumIdAll) with open('D:\XiMaLaya\\albumIdAll\\' + str('albumIdAll.txt'), 'a', encoding='utf-8') as f: for x in albumIdAll: f.write(str(x)) myList = [] url3 = [] for i in (albumIdAll[:1]): # 获取对应专辑ID的首页 url2 = 'https://www.ximalaya.com/revision/play/album?albumId=' + i print(url2) # 进入对应专辑ID的首页信息 html2 = requests.get(url2.split(',')[0], headers=self.header) # 含有下载URL的集合 # src "http://audio.xmcdn.com/group12/M03/2C/AA/wKgDW1WJ7GqxuItqAB8e1LXvuds895.m4a" url3 = (re.findall(r'"src":"(.*?)"', (html2).text)) # 记录信息用的 myList.append('获取对应专辑ID的首页\r\n' + url2 + '\n---------------------------------------') myList.append('含有下载URL的集合\r\n' + html2.text + '\n---------------------------------------') myList.append('下载专辑的URL集合\r\n' + str(url3) + '\n---------------------------------------') with open('D:\XiMaLaya\\albumIdAll\\' + str('hhh.txt'), 'a', encoding='utf-8') as f: f.write(json.dumps(myList)) print('done') return url3 # 下载专辑的URL集合 # 第三步: 获取专辑名 def getTitle(self, html): t = re.findall(r'"title":"(.*?)"', (html).text) # 获取titile(歌名)的值 with open('D:\XiMaLaya\\albumIdAll\\' + str('albumId_Name.txt'), 'a', encoding='utf-8') as f: f.write(str(t)) return t # 第四步: 下载歌曲 def downLoad(self, url, title): n = 0 for i in url: try: urllib.request.urlretrieve(i, 'D:\XiMaLaya\\'+str(title[n]+'.m4a')) print(str(title[n]), '...【下载成功】') n = n + 1 except: print(str(title[n]) + "...【下载失败】") if __name__ == '__main__': fm = XimaLaya() # 输入需要下载的歌曲URL str1 = "yinyue/12521114/" # 获取对应歌曲类型的首页信息 html = fm.getHtml(str1) # 获取歌曲类型的首页里面的专辑名称 title = fm.getTitle(html) # 获取歌曲类型的首页里面的专辑ID url3 = fm.getAlbumId(html) # 下载对应曲目 fm.downLoad(url3, title)
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!