zoukankan      html  css  js  c++  java
  • Python批量爬取周杰伦的音乐


    基本开发环境

    ·Python 3.6

    ·Pycharm


    目标网站分析

     

     点击播放按钮,会自动跳转到音乐播放页面

     播放界面有一个下载按钮,点击下载

    是需要登录账号

    ·打开开发者工具

    ·选择network

    ·点击立即下载

    会有一个下载的接口,post请求的数据接口,里面返回的数据有携带音频真实地址

    复制url地址,是会自动下载到本地的

    既然是post请求,只需要看data参数的变化,看它需要传递哪些参数

    多查看几首歌曲的下载地址,就可以发现copyrightId就是每首音乐的ID值,只需要获取每首歌曲的ID值,就可以下载音乐了。

    所以返回到周杰伦的音乐列表页

     

    可以发现音乐列表页是静态网站,获取可以直接用过requests请求网站解析网站数据,可以获取音乐的ID值以及标题。

    现在就剩下最后一个问题了,那就是翻页,多页获取。

    对于翻页爬取,只需要点击下一页吗,查看url地址的变化,找到其对应的变化规律即可。

     page就是对应的页码,所以翻页爬取页搞定了,接下来就是写代码就好了

    1、请求网页获取音乐的ID值以及标题

    def get_mp3_info(url):
        headers = {
            'cookie': '',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
        }
        response = requests.get(url=url, headers=headers)
        selector = parsel.Selector(response.text)
        lis = selector.css('#J_PageSonglist > div.songlist-body > div')
        for li in lis:
            page_url = li.css('.song-name-txt::attr(href)').get()
            mp3_id = page_url.split('/')[-1]
            title = li.css('.song-name-txt::attr(title)').get()
    

      

    2、post请求获取音乐下载地址

    这里headers参数可以不用写这么多,为了方便就直接复制粘贴了,因为是post请求,有一些参数是必要带的,不然得到想要的返回结果。

    def get_mp3_url(mp3_id, title):
        url = 'https://music.migu.cn/v3/api/order/download'
        headers = {
            'authority': 'music.migu.cn',
            'method': 'POST',
            'path': '/v3/api/order/download',
            'scheme': 'https',
            'accept': '*/*',
            'accept-encoding': 'gzip, deflate, br',
            'accept-language': 'zh-CN,zh;q=0.9',
            'cache-control': 'no-cache',
            'content-length': '42',
            'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'cookie': '',
            'origin': 'https://music.migu.cn',
            'pragma': 'no-cache',
            'referer': 'https://music.migu.cn/v3/music/order/download/60054701923',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
            'x-requested-with': 'XMLHttpRequest',
        }
    
        data = {
            'copyrightId': '{}'.format(mp3_id),
            'payType': '01',
            'type': '1'
        }
        response = requests.post(url=url, data=data, headers=headers)
        html_data = response.json()
        mp3_url = html_data['downUrl']
    

      

    3、保存音乐到本地

    def download(download_url, title):
        response = requests.get(url=download_url)
        path = '音乐\' + title + '.mp3'
        with open(path, mode='wb') as f:
            f.write(response.content)
    

      

    实现效果

    有一部分的音乐还是需要付费的,所以当你post 请求付费音乐的时间, 是没有下载地址的可以写一个判断

  • 相关阅读:
    Springboot整合dubbo搭建基本的消费、提供和负载均衡
    SpringBoot与Dubbo整合的三种方式
    Dubbo整合SpringBoot
    Java 如何有效地避免OOM:善于利用软引用和弱引用
    finalize的作用
    垃圾回收
    不同JDK版本之间的intern()方法的区别-JDK6 VS JDK6+
    Java8内存模型—永久代(PermGen)和元空间(Metaspace)
    to meet you
    Atomic long 和long的区别
  • 原文地址:https://www.cnblogs.com/Martinaoh/p/14344162.html
Copyright © 2011-2022 走看看