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

Oct 23, 2018 pm 04:35 PM
python3

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Apr 01, 2025 pm 05:09 PM

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Apr 01, 2025 pm 11:15 PM

Lorsque vous utilisez la bibliothèque Pandas de Python, comment copier des colonnes entières entre deux frames de données avec différentes structures est un problème courant. Supposons que nous ayons deux dats ...

Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Apr 02, 2025 am 07:18 AM

Comment enseigner les bases de la programmation novice en informatique dans les 10 heures? Si vous n'avez que 10 heures pour enseigner à l'informatique novice des connaissances en programmation, que choisissez-vous d'enseigner ...

Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Apr 02, 2025 am 07:15 AM

Comment éviter d'être détecté lors de l'utilisation de FiddlereVerywhere pour les lectures d'homme dans le milieu lorsque vous utilisez FiddlereVerywhere ...

Que sont les expressions régulières? Que sont les expressions régulières? Mar 20, 2025 pm 06:25 PM

Les expressions régulières sont des outils puissants pour la correspondance des motifs et la manipulation du texte dans la programmation, améliorant l'efficacité du traitement de texte sur diverses applications.

Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Apr 01, 2025 pm 10:51 PM

Comment Uvicorn écoute-t-il en permanence les demandes HTTP? Uvicorn est un serveur Web léger basé sur ASGI. L'une de ses fonctions principales est d'écouter les demandes HTTP et de procéder ...

Comment créer dynamiquement un objet via une chaîne et appeler ses méthodes dans Python? Comment créer dynamiquement un objet via une chaîne et appeler ses méthodes dans Python? Apr 01, 2025 pm 11:18 PM

Dans Python, comment créer dynamiquement un objet via une chaîne et appeler ses méthodes? Il s'agit d'une exigence de programmation courante, surtout si elle doit être configurée ou exécutée ...

Quelles sont les bibliothèques Python populaires et leurs utilisations? Quelles sont les bibliothèques Python populaires et leurs utilisations? Mar 21, 2025 pm 06:46 PM

L'article traite des bibliothèques Python populaires comme Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask et Demandes, détaillant leurs utilisations dans le calcul scientifique, l'analyse des données, la visualisation, l'apprentissage automatique, le développement Web et H et H

See all articles