吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4993|回复: 40
收起左侧

[Python 转载] 音乐爬虫-网易云

  [复制链接]
哈_喽 发表于 2020-10-30 13:44
我发布个酷我的爬虫都能被喷,说我只能酷我这个没技术含量的。。。。真是服了
网易云这个稍微复杂了一些,其中涉及到随机数加密,AES加密,RSA加密。这个就有技术含量了吧。
[Python] 纯文本查看 复制代码
#coding=utf-8

import base64
import codecs
import math
import os
import random
from Crypto.Cipher import AES
import requests


class get_args():
    def __init__(self,dict):

        self.a_16 = self.a(16)
        self.dict = dict
    def a(slef,a):
        b="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        c=""
        for i in range(a):
            e=random.random()*len(b)
            e=math.floor(e)
            c+=b[e]
        return c


    # AES加密
    def to_16(self,key):
        while len(key) % 16 !=0:
            key += '\0'
        return key.encode('utf-8')
    def AES_encrypt(self,text,key,iv): ##text为密文,key为公钥,iv为偏移量
        pad2 = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
        data=pad2(text)
        encryptor = AES.new(self.to_16(key), AES.MODE_CBC, self.to_16(iv))

        encrypt_aes = encryptor.encrypt(data.encode('utf-8'))
        encrypt_text = base64.encodebytes(encrypt_aes)
        enctext = encrypt_text.decode('utf-8')
        return enctext


    def get_params(self):#song为歌曲名   返回值为params
        iv="0102030405060708"
        g = '0CoJUm6Qyw8W8jud'
        i=self.a_16
        encText=str(self.dict)#i8a


        return self.AES_encrypt(self.AES_encrypt(encText,g, iv), i, iv)


    def RSA_encrypt(self,text, pubKey, modulus):
        text=text[::-1]
        rs=int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(pubKey, 16) % int(modulus, 16)
        return format(rs, 'x').zfill(256)

    def get_encSecKey(self):
        i = self.a_16
        b = "010001"
        c = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
        return self.RSA_encrypt(i, b, c)

class music():
    def __init__(self):
        self.headers2 = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
        }
        self.headers = {
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
            'Accept': '*/*',
            'Referer': 'https://music.163.com/search/',
            'Connection': 'keep-alive',
            'cookie': '_iuqxldmzr_=32; _ntes_nnid=2c2050b762a20bec42d44b4ec9570db2,1596545803404; _ntes_nuid=2c2050b762a20bec42d44b4ec9570db2; WM_TID=P%2B9S%2BGxp32pBVAVRRQZqCt7Cgd%2BGver%2B; NMTID=00OeaJw_6w3Xsbamkk4mtz6A4aQ648AAAF0w8UCbA; WM_NI=uJgfo1tpOzmOzCi1zZbOYbXBDNPDlNewZXU3yQ3iumqfEggri%2BRhKdTEiIHOU2SXI3IuFjOG%2FKSi%2FAeBDlsY02AdcF3eDGC7oT5jbtTM7WD72FNddwZuZ8YelJFmI76NRXY%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb6f0659a86fca5cc6093928fa6d14e968e9eaeb547898f8190d24686b7a0a7cb2af0fea7c3b92ab796a987ee3bb8b0819bf045ba9da7d2f952a2919783db4a8892a0a5ef46a7a996b9d839bb8ffd8af867b3ba8b88e67aabf59e89ca70989ba7aacb4597ee9db9cc398bab8a8bce4ded959d8aae4ba79e8c8df253f4ee8f85e24ef1bb8ca8c23dad8cfb8be1809893f9b8c73df29a8285e77d9aab96d9dc6fb0968a8ecc3df6929eb9dc37e2a3; JSESSIONID-WYYY=C1rSDXpSvPOpS%2FNHFyKe%5Cw3yY4%2F5bq5ntcfQ2QEqxSCJxkrD1%5CYeJdAGWIQmJpUIY5%5CtjA3S%2FrCedOHlKjFkPy5X4Eje7wt%2BHzgrcVRV%2BmXMRO8G%5CsxeUd9MBwwvqzIuEbuJkpv9mv6bCvQBzI9bI1qQl8WnFzFvy5Z0SqVeIAGYexqB%3A1601034012504'
        }  # 请求头
        self.url='https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
        s= input('请输入想要听的歌:')
        self.arg = {'csrf_token': "",'hlposttag':'<span class="s-fc\">','limit':'30','offset':'0','s':'{0}'.format(s),'total':'true','type':'1' }
        self.class_arg = get_args(self.arg)
        self.params={
            'params':self.class_arg.get_params(),
            'encSecKey':self.class_arg.get_encSecKey()
        }
        self.song = []
        self.singer = []
        self.id = []
        self.dt = []
    def search(self):
        response = requests.post(self.url, headers=self.headers, data=self.params)
        dict = response.json()
        music_list = dict['result']['songs']
        for music in music_list:
            self.song.append(music['name'])
            self.singer.append(music['ar'][0]['name'])
            self.id.append(music['id'])
            self.dt.append(music['dt'])
        self.select()
    def select(self):
        ip = 0
        for song, singer, id, dt in zip(self.song, self.singer, self.id, self.dt):
            min = int(int(dt)/1000/60)
            seconds = int(int(dt)/1000%60)
            time = str(min)+":"+str(seconds)
            print(ip,song,singer,time)
            ip += 1
        ip = input("请输入序号:")
        ip = int(ip)
        song = self.song[ip]
        singer = self.singer[ip]
        id = self.id[ip]
        self.download(song,singer,id)
    def download(self,song,singer,id):
        url = 'https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token='
        arg = {'csrf_token': '', 'encodeType': 'aac', 'ids': "[" + '{0}'.format(id) + "]",
                    'level': 'standard'}
        class_arg = get_args(arg)
        params = {
            'params': class_arg.get_params(),
            'encSecKey': class_arg.get_encSecKey()
        }
        response = requests.post(url, headers=self.headers, data=params)
        dict = response.json()
        url = dict['data'][0]['url']
        music = requests.get(url, headers=self.headers2).content
        dir = os.getcwd()
        dir = os.path.join(dir, "网易云音乐 ")
        if not os.path.exists(dir):
            os.mkdir(dir)  # 构造文件夹
        os.chdir(dir)  # 将下载的歌曲存储在该文件夹
        print(song, singer)
        file_name = song + '-' + singer + '.m4a'  # 文件名
        with open(file_name, 'wb') as f:
            f.write(music)
        print("下载成功!")


if __name__ == '__main__':
    music = music()
    music.search()



免费评分

参与人数 14吾爱币 +22 热心值 +13 收起 理由
BrightMrW + 1 我很赞同!
yangkaizeng + 1 + 1 谢谢@Thanks!
三滑稽甲苯 + 1 + 1 做自己的事,让他人去说
emaer + 1 + 1 相信自己,继续做自己喜欢的,不要在乎别人怎么说。
羊村恶霸懒羊羊 + 1 谢谢@Thanks!
situgong + 1 + 1 谢谢@Thanks!
苏紫方璇 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hxw0204 + 1 + 1 谢谢@Thanks!
Foryou丶恋 + 1 + 1 我很赞同!
南方棋生 + 1 + 1 我很赞同!
EmderJM + 1 + 1 我很赞同!
苏苏的小跟班 + 1 + 1 热心回复!
虎兜的肚兜 + 1 + 1 加油,虽然我不是编程行业,但是很支持你们在论坛有作为
Jeraxx + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

枫叶飞向海 发表于 2020-10-30 13:56
学习了,别理哪些喷子
 楼主| 哈_喽 发表于 2020-11-2 22:10
白眼 发表于 2020-11-2 21:20
楼主你好  刚学爬虫  想知道那个 header 请求头该怎么写,就是对应不同的网页是不是会有不同的填法{:301_97 ...

对的,大部分网页是只写ua就行,但有些网页还会检测来源,所以需要添加来源,你可以随便找个网站F12看看浏览器给服务期发送消息,浏览器用了那些headers
Valesail 发表于 2020-10-30 13:47
这个……又没说别人是辣鸡,有啥可喷的。
总之学习了,感谢大佬。
wendy123 发表于 2020-10-30 13:48
学习,感谢大佬。
miya 发表于 2020-10-30 13:49

学习,感谢大佬
酒神chao 发表于 2020-10-30 13:49
感谢大佬!
594046245 发表于 2020-10-30 13:49
来个酷狗的
南岸 发表于 2020-10-30 13:52
学习了,感谢楼主
Jeraxx 发表于 2020-10-30 14:01
开发完项目就去学习爬虫
 楼主| 哈_喽 发表于 2020-10-30 14:16

发布了,你看看我发布的贴子
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表