40 linhas de código implementam um rastreador de música legal com python

Não há muito a dizer diretamente ao código:

import requests, os


class Spider:
    def __init__(self):
        self.singer_name = input('请输入要爬取的歌手名:')
        self.pages = int(input('请输入爬取页数(一页30首歌):'))
        os.mkdir('{}'.format(self.singer_name))
        self.headers = {'Accept': ',application/json, text/plain, */*',#请求头信息
                        'Accept-Encoding': 'gzip, deflate',
                        'Accept-Language': 'zh-CN,zh;q=0.9',
                        'Connection': 'keep-alive',
                        'Cookie': '_ga=GA1.2.1637941648.1616934252; uname3=qq1616934321; t3kwid=131286315; websid=1488073791; pic3=""; t3=qq; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1617949101,1618127723,1618579672,1619099581; _gid=GA1.2.1505163314.1619099581; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1619100738; _gat=1; kw_token=XM5GXCP8M5',
                        'csrf': 'XM5GXCP8M5',
                        'Host': 'www.kuwo.cn',
                        'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'}

    def main(self):
        for page in range(self.pages):
            print('正在爬取第{}页的歌曲!'.format(page + 1))#不断改变爬取的页数
            url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={}&pn={}&rn=30&httpsStatus=1&reqId=b4274401-a377-11eb-a99d-ef0323beeee3'.format(
                self.singer_name, page + 1)
            response = requests.get(url, headers=self.headers)
            json = response.json()#得到储存歌曲信息的json文件,下面是层层解析获取name和rid
            data = json['data']
            song_list = data['list']
            for song in song_list:
                song_name = song['name']
                song_rid = song['rid']
                song_json_url = 'http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1619102008389&httpsStatus=1&reqId=b4280751-a377-11eb-a99d-ef0323beeee3'.format(
                    song_rid)#不断改变rid以获取不同歌取的mp3地址
                print('正在爬取{}。。。'.format(song_name))
                song_url = requests.get(song_json_url, headers=self.headers).json()['url']#请求歌曲的mp3地址,将响应以二进制文件储存到本地
                with open('{}/{}.mp3'.format(self.singer_name, song_name), 'wb') as wstream:
                    wstream.write(requests.get(song_url).content)
                print('爬取成功!')
if __name__ == '__main__':
    music=Spider()
    music.main()
    os.system('pause')

Primeiro, vá ao site oficial da Kuwo Music: http://www.kuwo.cn/

Digite o nome do cantor a ser rastreado na barra de pesquisa:

 Venha para esta página e clique com o botão direito para verificar:

 Clique na ordem conforme a figura abaixo:

 Você pode ver que a resposta aqui é um arquivo no formato json. Em seguida, vamos analisar o json

Copie esta resposta em um arquivo json para formatação e expanda na sequência:

Verifica-se que todas as informações da música desta página são armazenadas nesta 'lista' e, em seguida, continue a expandir uma das músicas:

 Aqui você pode encontrar o rid e o nome da música. Essas duas informações são úteis. O rid é usado para nos ajudar a localizar o arquivo mp3 onde a música está localizada. O nome é usado para nomear a música ao fazer o download da música.

Volte para a página anterior:

Verifica-se que a resposta obtida por este url contém o endereço de reprodução da música (ou seja, o url do arquivo mp3), você pode copiar diretamente o url da música para a barra de endereços para solicitar e irá para a reprodução interface de uma música:

Em seguida, alterar diferentes rids naturalmente obterá urls de músicas diferentes e, em seguida, solicitamos diretamente esses urls, e a resposta que obtemos é este arquivo mp3, que pode ser aberto e reproduzido por qualquer jogador após ser armazenado localmente em formato binário, e você também pode Empacote seu programa em um arquivo exe e envie-o para seus amigos para uso.

Aqui solicitamos um total de três urls:

Um: armazenar as informações da música da página atual (rid e nome, etc.)

Dois: armazene um determinado ID correspondente ao endereço de reprodução do url da música

Três: a própria música

Quando solicitamos, devemos adicionar o cabeçalho da solicitação ou não obteremos as informações:

Salve os cabeçalhos da solicitação aqui em um dicionário no código (se você tem medo de problemas, pode usar o do autor).

A seguinte chave corresponde à palavra-chave que você pesquisou, pn representa o número de páginas e rn é o número de músicas em cada página. Podemos modificá-la de forma independente para obter as músicas e o número de músicas de diferentes cantores:

 

A ideia geral é relativamente clara: solicitar a url para armazenar informações da música (esta url pode alterar as palavras-chave de pesquisa e os números das páginas para obter músicas e o número de cantores diferentes), solicitar o armazenamento da url do endereço de reprodução da música (esta url pode ser alterado alterando o valor rid para obter um endereço de reprodução de música diferente), solicite o endereço do arquivo mp3 da música (obtenha a resposta binária e salve-a localmente).

Precisa dominar as seguintes habilidades: sintaxe básica do python e tipos básicos de dados, uso simples da biblioteca de solicitações.

Este é o primeiro post do autor e espero que seja útil para amigos que aprenderam alguns conceitos básicos de python e que possa ser usado como o primeiro pequeno projeto na área de répteis. Amigos que tiverem dúvidas podem deixar uma mensagem na área de comentários, espero que todos apoiem!

                                                                                       Se houver algum erro ou omissão, obrigado por entrar em contato e corrigir.

                                                                                       Se houver alguma violação, entre em contato para excluir.

Acho que você gosta

Origin blog.csdn.net/m0_52726759/article/details/119145600
Recomendado
Clasificación