この記事では、Python3 クローラーの NetEase Cloud Music Crawler の例を紹介します。一定の参考値があるので、困っている友達は参考にしていただければ幸いです。
今回の目標は、NetEase Cloud Music 上の指定された曲に関するすべてのコメントをクロールし、ワード クラウドを生成することです
具体的な手順:
1: JS 暗号化の実装
この Ajax インターフェイスを見つけるのは難しくありませんが、問題は、渡されるデータが JS 暗号化を通じて取得されるため、確認する必要があることです。 jsコード。
デバッグを中止すると、core_8556f33641851a422ec534e33e6fa5a4.js?8556f33641851a422ec534e33e6fa5a4.js の window.asrsea 関数によってデータが暗号化されていることがわかります。
さらに検索すると、次の関数が見つかります:
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 } }()
したがって、Python を使用して上記 4 つの関数を実装する必要があります。 1 つ目のランダムな文字列を生成する関数は難しくありません。実装されたコードは次のとおりです:
# 生成随机字符串 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
2 つ目は AES 暗号化を実装する関数で、AES 暗号化を使用するには Crypto ライブラリを使用する必要があります。このライブラリがインストールされていない場合は、まず pycrypto ライブラリをインストールしてから、Crypto ライブラリをインストールする必要があります。インストールが成功したら、Crypto がなく、インポート時に crypto のみが存在する場合は、まず Python インストール ディレクトリの Lib\site-packages\crypto フォルダーを開きます。その中に Cipher フォルダーがある場合は、 # に戻ります。 # #Lib\site-packages ディレクトリ内の crypto の名前を Crypto に変更すると、正常にインポートされるはずです。
AES 暗号化の平文の長さは 16 の倍数である必要があるため、長さが 16 の倍数になるように平文に必要なパディングを実行する必要があります。AES 暗号化モードは AES.MODE_CBC、初期化です。ベクトル iv ='0102030405060708'。 AES 暗号化を実装するコードは次のとおりです。# 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_text3 番目は、RSA 暗号化を実装する関数です。
RSA 暗号化では、平文と暗号文は両方とも数値です。 RSA の暗号文は、平文を表す数値の mod N の E 乗を求めた結果です . RSA 暗号化後に得られる文字列の長さは 256 です。長さが足りない場合は、次のように埋めます。それを x 文字で表示します。
RSA 暗号化を実装するコードは次のとおりです:# 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)4 番目の関数は、2 つの暗号化パラメータを取得する関数です。渡される 4 つのパラメータ、最初のパラメータ
JSON.stringify (i3x) は次の内容で、offset パラメータと limit パラメータが必要です。offset の値は (ページ数 - 1)*20、limit の値は 20
'{"offset":'+str(offset)+',"total":"True","limit":"20","csrf_token":""}'です。 2 番目のパラメータ、3 番目のパラメータ、および 4 番目のパラメータの値は Zj4n.emj に従って取得されます。
encText の値は次のとおりです。 AES を 2 回通過 暗号化され、encSecKey は RSA 暗号化を通じて取得されます、実装のための特定のコードは次のとおりです:
# 获取参数 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, encSecKey2. コメントを解析して保存します
# 爬取评论内容 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("爬取失败!")3. ワード クラウドの生成 このステップに進む前に、jieba モジュールと wordcloud モジュールをインストールする必要があります。jieba モジュールは中国語に使用されるモジュールです。単語セグメンテーション. 、wordcloud モジュールはワード クラウドを生成するために使用されるモジュールであり、独学で学習できます。 この部分については詳しく説明しません。具体的なコードは次のとおりです:
# 生成词云 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")完全なコードは github にアップロードされています (font.ttf ファイルを含む): https:/ /github.com/QAQ112233/WangYiYun
以上がPython3 クローラーの例 NetEase Cloud 音楽クローラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。