Python实例---爬取下载喜马拉雅音频文件

PyCharm下python爬虫准备

打开pycharm

点击设置

点击项目解释器,再点击右边+号

搜索相关库并添加,例如:requests

image

喜马拉雅全网递归下载

打开谷歌/火狐浏览器,按F12打开开发者工具—>选择【网络】

编辑器浏览器输入: https://www.ximalaya.com/yinyue/  点击【摇滚】

发现弹出新的URL:https://www.ximalaya.com/yinyue/yaogun/    [汉字转换拼音后的URL访问]

image

点击进入任意一个专辑[未播放]

image

image

点击播放音乐[播放中]

image

[是一个json格式的URL]访问搜索界面的源代码,查找albumId,通过这些albumid获取音频文件的url

https://www.ximalaya.com/revision/play/album?albumId=16372952&pageNum=1&sort=-1&pageSize=30

image

最后使用函数urllib.request.urlretrieve()下载音乐即可

image

image

附源码:

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/ 

点击计入音乐[未播放前]

image

点击进入音乐[播放中]

image

[是一个json格式的URL]访问搜索界面的源代码,查找albumId,通过这些albumid获取音频文件的url

https://www.ximalaya.com/revision/play/album?albumId=12521114&pageNum=1&sort=-1&pageSize=30

image

最后使用函数urllib.request.urlretrieve()下载音乐即可

image

image

附源码:

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)


posted @ 2018-09-09 00:44  小a玖拾柒  阅读(7622)  评论(0编辑  收藏  举报