>  기사  >  백엔드 개발  >  Python3 크롤러 예시 NetEase Cloud 음악 크롤러

Python3 크롤러 예시 NetEase Cloud 음악 크롤러

青灯夜游
青灯夜游앞으로
2018-10-23 16:35:154048검색

이 기사에서는 Python3 크롤러의 NetEase Cloud Music Crawler 예제를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

이번 목표는 NetEase Cloud Music에서 특정 노래에 대한 모든 댓글을 크롤링하고 단어 구름을 생성하는 것입니다.

구체적인 단계:

One: 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을 사용해야 합니다. 임의의 문자열을 생성하는 첫 번째 함수는 어렵지 않습니다. 구현된 코드는 다음과 같습니다.

# 生成随机字符串
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

두 번째는 AES 암호화를 구현하는 함수이며, AES 암호화를 사용하려면 Crypto 라이브러리를 사용해야 합니다. 이 라이브러리가 설치되어 있지 않으면 먼저 pycrypto 라이브러리를 설치한 다음 Crypto 라이브러리를 설치해야 합니다. 성공적으로 설치한 후 가져올 때 Crypto가 없고 crypto만 있는 경우 먼저 Python 설치 디렉터리에서 Libsite-packagescrypto 폴더를 엽니다. Cipher 폴더가 있으면 Libsite-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_text

세 번째는 RSA 암호화를 구현하는 함수입니다.

RSA 암호화에서는 일반 텍스트와 암호문이 모두 숫자입니다. RSA의 암호문은 숫자의 E입니다. 이는 일반 텍스트를 나타냅니다. power mod N을 찾은 결과는 입니다. 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개의 매개변수 중 첫 번째 매개변수인

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 암호화를 통해 얻고, 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, encSecKey

2. 구문 분석 및 댓글 저장


미리보기 정보를 보면 사용자 이름과 댓글 내용이 json 형식의 데이터로 저장되어 있는 것을 확인할 수 있습니다

파싱이 쉬우니 닉네임과 내용만 직접 추출하시면 됩니다. 획득한 데이터는 노래 파일명과 함께 txt 파일로 저장됩니다. 구현된 코드는 다음과 같습니다.

# 爬取评论内容
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제