• 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)
    
    
    
  • 相关阅读:
    【转】PowerManager 与 WakeLock
    【转】设计模式总结之模式分类
    【转】一篇文章,教你学会Git
    【转】Iconfont
    【转】码云source tree 提交超过100m 为什么大文件推不上去
    各 Android 平台版本支持的 API 级别
    【转】Android进程机制
    【转】数据库CRUD操作
    【转】数据库--视图的基本概念以及作用
    动态规划的两种形式
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9611334.html
Copyright © 2020-2023  润新知