zoukankan      html  css  js  c++  java
  • 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:XiMaLayahtml\' + 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的首页
    ' + url2 + '
    ---------------------------------------')
                myList.append('含有下载URL的集合
    ' + html2.text + '
    ---------------------------------------')
                myList.append('下载专辑的URL集合
    ' + str(url3) + '
    ---------------------------------------')
                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的首页
    ' + url2 + '
    ---------------------------------------')
                myList.append('含有下载URL的集合
    ' + html2.text + '
    ---------------------------------------')
                myList.append('下载专辑的URL集合
    ' + str(url3) + '
    ---------------------------------------')
                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)
    
    
    
  • 相关阅读:
    老鼠走迷宫
    堆栈的应用 问题还未解决
    计数排序与基数排序
    C++类的描述
    选择排序 冒泡排序 插入排序
    计算名次
    多项式求值 n维多项式 Horner解法
    003_sublime如何实时预览markdown
    002_git下载的源码怎么打成jar包呢?
    001_idea常用插件
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9611334.html
Copyright © 2011-2022 走看看