Maison > développement back-end > Tutoriel Python > Exemple de robot d'exploration Python3 Robot d'exploration de musique NetEase Cloud

Exemple de robot d'exploration Python3 Robot d'exploration de musique NetEase Cloud

青灯夜游
Libérer: 2018-10-23 16:46:30
avant
4164 Les gens l'ont consulté

Ce que cet article vous apporte est l'exemple de robot d'exploration Python3 de NetEase Cloud Music Crawler. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

L'objectif cette fois est d'explorer tous les commentaires sur la chanson spécifiée sur NetEase Cloud Music et de générer un nuage de mots

Étapes spécifiques :

1 : Implémenter le cryptage JS

Il n'est pas difficile de trouver cette interface ajax. Le problème est que les données transmises sont obtenues via le cryptage js, vous devez donc vérifier. le code js.

En coupant le débogage, vous pouvez constater que les données sont cryptées par la fonction window.asrsea dans core_8556f33641851a422ec534e33e6fa5a4.js?8556f33641851a422ec534e33e6fa5a4.js.

Grâce à une recherche plus approfondie, vous pouvez trouver la fonction suivante :

function() {
    // 生成长度为16的随机字符串
    function a(a) {
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
        for (d = 0; a > d; d += 1)
            e = Math.random() * b.length,
            e = Math.floor(e),
            c += b.charAt(e);
        return c
    }
    // 实现AES加密
    function b(a, b) {
        var c = CryptoJS.enc.Utf8.parse(b)
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a)
          , f = CryptoJS.AES.encrypt(e, c, {
            iv: d,
            mode: CryptoJS.mode.CBC
        });
        return f.toString()
    }
    // 实现RSA加密
    function c(a, b, c) {
        var d, e;
        return setMaxDigits(131),
        d = new RSAKeyPair(b,"",c),
        e = encryptedString(d, a)
    }
    // 得到加密后的结果
    function d(d, e, f, g) {
        var h = {}
          , i = a(16);
        return h.encText = b(d, g),
        h.encText = b(h.encText, i),
        h.encSecKey = c(i, e, f),
        h
    }
    function e(a, b, d, e) {
        var f = {};
        return f.encText = c(a + e, b, d),
        f
    }
}()
Copier après la connexion

Nous devons donc utiliser Python pour implémenter les quatre fonctions ci-dessus. La première fonction pour générer une chaîne aléatoire n'est pas difficile. Le code implémenté est le suivant :

# 生成随机字符串
def generate_random_string(length):
    string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    # 初始化随机字符串
    random_string = ""
    # 生成一个长度为length的随机字符串
    for i in range(length):
        random_string += string[int(floor(random() * len(string)))]
    return random_string
Copier après la connexion

La seconde est une fonction pour implémenter le cryptage AES, et l'utilisation du cryptage AES nécessite l'utilisation de la bibliothèque Crypto. Si cette bibliothèque n'est pas installée, vous devez d'abord installer la bibliothèque pycrypto, puis installer la bibliothèque Crypto. Après une installation réussie, S'il n'y a pas de Crypto mais seulement de crypto lors de l'importation, ouvrez d'abord le dossier Libsite-packagescrypto dans le répertoire d'installation de Python. S'il contient un dossier Cipher, revenez à Libsite-. packages Renommez crypto en Crypto dans le répertoire, puis il devrait être importé avec succès.

Étant donné que la longueur du texte brut crypté AES doit être un multiple de 16, nous devons effectuer le remplissage nécessaire sur le texte brut pour garantir que sa longueur est un multiple de 16. Le mode de cryptage AES est AES.MODE_CBC, vecteur d'initialisation iv = '0102030405060708'.

Le code pour implémenter le cryptage AES est le suivant :

# AES加密
def aes_encrypt(msg, key):
    # 如果不是16的倍数则进行填充
    padding = 16 - len(msg) % 16
    # 这里使用padding对应的单字符进行填充
    msg += padding * chr(padding)
    # 用来加密或者解密的初始向量(必须是16位)
    iv = '0102030405060708'
    # AES加密
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 加密后得到的是bytes类型的数据
    encrypt_bytes = cipher.encrypt(msg)
    # 使用Base64进行编码,返回byte字符串
    encode_string = base64.b64encode(encrypt_bytes)
    # 对byte字符串按utf-8进行解码
    encrypt_text = encode_string.decode('utf-8')
    # 返回结果
    return encrypt_text
Copier après la connexion

Le troisième est la fonction pour implémenter le cryptage RSA, Dans le cryptage RSA, le texte en clair et le texte chiffré sont des nombres, Le texte chiffré de RSA est le résultat mod N de la puissance E du nombre représentant le texte en clair La longueur de la chaîne obtenue après cryptage RSA est de 256. Elle n'est pas assez longue et on remplit. avec x caractères.

Le code pour implémenter le cryptage RSA est le suivant :

# RSA加密
def rsa_encrypt(random_string, key, f):
    # 随机字符串逆序排列
    string = random_string[::-1]
    # 将随机字符串转换成byte类型数据
    text = bytes(string, 'utf-8')
    # RSA加密
    sec_key = int(codecs.encode(text, encoding='hex'), 16) ** int(key, 16) % int(f, 16)
    # 返回结果
    return format(sec_key, 'x').zfill(256)
Copier après la connexion

La quatrième fonction est une fonction qui obtient deux paramètres de cryptage. Les quatre paramètres transmis, le premier paramètre JSON. .stringify(i3x) est le contenu suivant, où les paramètres offset et limit sont requis. La valeur de offset est (nombre de pages -1)*20 et la valeur de limit est 20

'{"offset":'+str(offset)+',"total":"True","limit":"20","csrf_token":""}'
Copier après la connexion
.

Les valeurs du deuxième paramètre, du troisième paramètre et du quatrième paramètre sont toutes obtenues selon Zj4n.emj :

Le la valeur de encText est Il est obtenu via deux cryptages AES. encSecKey est obtenu via le cryptage RSA Le code spécifique pour l'implémentation est le suivant :

# 获取参数
def get_params(page):
    # 偏移量
    offset = (page - 1) * 20
    # offset和limit是必选参数,其他参数是可选的
    msg = '{"offset":' + str(offset) + ',"total":"True","limit":"20","csrf_token":""}'
    key = '0CoJUm6Qyw8W8jud'
    f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a87' \
        '6aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9' \
        'd05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b' \
        '8e289dc6935b3ece0462db0a22b8e7'
    e = '010001'
    # 生成长度为16的随机字符串
    i = generate_random_string(16)
    # 第一次AES加密
    enc_text = aes_encrypt(msg, key)
    # 第二次AES加密之后得到params的值
    encText = aes_encrypt(enc_text, i)
    # RSA加密之后得到encSecKey的值
    encSecKey = rsa_encrypt(i, e, f)
    return encText, encSecKey
Copier après la connexion

2. Analyser et enregistrer les commentaires
<. 🎜>

Réussi En regardant les informations d'aperçu, vous pouvez constater que le nom d'utilisateur et le contenu du commentaire sont stockés dans des données au format json

Par conséquent, ce sera facile. pour analyser. Extrayez simplement le pseudo et le contenu . Les données obtenues sont enregistrées dans un fichier txt avec le nom de fichier de la chanson. Le code implémenté est le suivant :

# 爬取评论内容
def get_comments(data):
    # data=[song_id,song_name,page_num]
    url = &#39;https://music.163.com/weapi/v1/resource/comments/R_SO_4_&#39; + str(data[0]) + &#39;?csrf_token=&#39;
    # 得到两个加密参数
    text, key = get_params(data[2])
    # 发送post请求
    res = requests.post(url, headers=headers, data={"params": text, "encSecKey": key})
    if res.status_code == 200:
        print("正在爬取第{}页的评论".format(data[2]))
        # 解析
        comments = res.json()[&#39;comments&#39;]
        # 存储
        with open(data[1] + &#39;.txt&#39;, &#39;a&#39;, encoding="utf-8") as f:
            for i in comments:
                f.write(i[&#39;content&#39;] + "\n")
    else:
        print("爬取失败!")
Copier après la connexion
3. Générer un nuage de mots

Avant de procéder à cette étape, vous devez installer les modules jieba et wordcloud. Segmentation de mots chinois Le module wordcloud est un module utilisé pour générer des nuages ​​de mots, que vous pouvez apprendre par vous-même.

Je n'entrerai pas dans les détails de cette partie. Le code spécifique est le suivant :

# 生成词云
def make_cloud(txt_name):
    with open(txt_name + ".txt", &#39;r&#39;, encoding="utf-8") as f:
        txt = f.read()
    # 结巴分词
    text = &#39;&#39;.join(jieba.cut(txt))
    # 定义一个词云
    wc = WordCloud(
        font_path="font.ttf",
        width=1200,
        height=800,
        max_words=100,
        max_font_size=200,
        min_font_size=10
    )
    # 生成词云
    wc.generate(text)
    # 保存为图片
    wc.to_file(txt_name + ".png")
Copier après la connexion
Le code complet a été téléchargé sur github (y compris le fichier font.ttf) : https https://github.com/QAQ112233/ WangYiYun

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal