40 行のコードで Python を使用したクールな音楽クローラーを実装

コードに直接言うことはあまりありません。

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')

まず、Kuwo Music の公式ウェブサイトにアクセスします: http://www.kuwo.cn/

検索バーにクロールする歌手の名前を入力します。

 このページにアクセスして右クリックして確認してください:

 以下の図に示すように、順番にクリックします。

 ここでの応答は json 形式のファイルであることがわかります。次に、json を解析しましょう

この応答を json ファイルにコピーしてフォーマットし、順番に展開します。

このページのすべての曲情報がこの「リスト」に保存されていることがわかり、曲の 1 つを展開し続けます。

 ここでは、曲の Rid と曲名を見つけることができます。これら 2 つの情報は役に立ちます。Rid は、曲が保存されている MP3 ファイルを見つけるのに役立ちます。名前は、曲をダウンロードするときに曲に名前を付けるために使用されます。

前のページに戻ります。

この URL によって得られる応答には、曲の再生アドレス (つまり、mp3 ファイルの URL) が含まれていることがわかります。曲の URL をアドレス バーに直接コピーしてリクエストすると、再生に進みます。曲のインターフェース:

次に、異なる Rid を変更すると、当然異なる曲の URL が取得されます。そして、これらの URL を直接リクエストすると、得られる応答はこの MP3 ファイルです。このファイルは、バイナリ形式でローカルに保存された後、任意のプレーヤーで開いて再生できます。プログラムを exe ファイルにパッケージ化し、友人に送信して使用してもらいます。

ここでは合計 3 つの URL をリクエストします。

1: 現在のページの曲情報 (ID と名前など) を保存します。

2: 曲の URL 再生アドレスに対応する特定の ID を保存する

3: 曲自体

リクエストするときは、リクエスト ヘッダーを追加する必要があります。追加しないと情報が取得できません。

ここでリクエスト ヘッダーをコード内の辞書に保存します (トラブルが心配な場合は、作成者の辞書を使用できます)。

次のキーは検索したキーワードに対応します。pn はページ数、rn は各ページの曲数を表します。これを個別に変更して、さまざまな歌手の曲と曲数を取得できます。

 

全体的なアイデアは比較的明確です。曲情報を保存するための URL をリクエストします (この URL は、曲とさまざまな歌手の数を取得するために検索キーワードとページ番号を変更できます)、曲の再生アドレスの URL を保存するためのリクエスト (この URL は、別の曲の再生アドレスを取得するには、rid 値を変更することで変更できます)、曲の mp3 ファイルのアドレスを要求します (バイナリ応答を取得してローカルに保存します)。

次のスキルを習得する必要があります: Python の基本構文と基本データ型、リクエスト ライブラリの簡単な使用。

これは著者の最初の投稿であり、Python の基本を学んだ友人にとって役立ち、爬虫類の分野での最初の小さなプロジェクトとして使用できることを願っています。質問があるお友達はコメント欄にメッセージを残してください。皆さんがサポートしてくれることを願っています。

                                                                                       間違いや記載漏れがございましたら、ご連絡・修正をよろしくお願いいたします。

                                                                                       権利侵害があった場合は削除のご連絡をお願いします。

おすすめ

転載: blog.csdn.net/m0_52726759/article/details/119145600