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 } }()
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
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
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)
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":""}'
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
2. Analyser et enregistrer les commentaires
<. 🎜>
# 爬取评论内容 def get_comments(data): # data=[song_id,song_name,page_num] url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_' + str(data[0]) + '?csrf_token=' # 得到两个加密参数 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()['comments'] # 存储 with open(data[1] + '.txt', 'a', encoding="utf-8") as f: for i in comments: f.write(i['content'] + "\n") else: print("爬取失败!")
# 生成词云 def make_cloud(txt_name): with open(txt_name + ".txt", 'r', encoding="utf-8") as f: txt = f.read() # 结巴分词 text = ''.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")
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!