ホームページ  >  記事  >  バックエンド開発  >  Scrapy を使用して Kugou Music の曲をクロールする方法は?

Scrapy を使用して Kugou Music の曲をクロールする方法は?

PHPz
PHPzオリジナル
2023-06-22 22:59:212722ブラウズ

インターネットの発展に伴い、インターネット上の情報量は増加しており、さまざまな分析やマイニングを行うために、さまざまな Web サイト上の情報をクローリングする必要があります。 Scrapy は、Web サイトのデータを自動的にクロールし、構造化された形式で出力できる、完全に機能する Python クローラー フレームワークです。 Kugou Music は最も人気のあるオンライン音楽プラットフォームの 1 つであり、以下では Scrapy を使用して Kugou Music の曲情報をクロールする方法を紹介します。

1. Scrapy のインストール

Scrapy は Python 言語をベースにしたフレームワークであるため、最初に Python 環境を設定する必要があります。 Scrapy をインストールする前に、まず Python と pip ツールをインストールする必要があります。インストールが完了したら、次のコマンドを使用して Scrapy をインストールできます:

pip install scrapy

2. 新しい Scrapy プロジェクトを作成します

Scrapy は、次のコマンド ライン ツールのセットを提供します。新しいプロジェクトの作成を容易にします。コマンドラインに次のコードを入力します:

scrapy startproject kuwo_music

実行後、「kuwo_music」という名前の Scrapy プロジェクトが現在のディレクトリに作成されます。このプロジェクトでは、Kugou Music の曲情報をクロールするための新しいクローラーを作成する必要があります。

3. 新しいクローラーの作成

Scrapy プロジェクトでは、クローラーは特定の Web サイト上のデータをクロールおよび解析するために使用されるプログラムです。 「kuwo_music」プロジェクト ディレクトリで、次のコマンドを実行します。

scrapy genspider kuwo www.kuwo.cn 

上記のコマンドにより、「kuwo_music/spiders」ディレクトリに「kuwo.py」という名前のファイルが作成されます。これは、クローラー プログラム コードです。このファイルで Web サイト データのクローリングと解析のプロセスを定義する必要があります。

4. Web サイトのリクエストとページの解析

新しく作成した「kuwo.py」ファイルで、まず必要なモジュールをインポートする必要があります:

import scrapy
from kuwo_music.items import KuwoMusicItem
from scrapy_redis.spiders import RedisSpider
from scrapy_redis import get_redis_from_settings
from scrapy.utils.project import get_project_settings

上記のコードを通じて、Scrapy フレームワークによって提供されるさまざまなツール クラスとメソッド、およびプロジェクト内のカスタム モジュールを使用できます。クローラー コードの作成を続ける前に、まず Kugou Music の曲情報が置かれている Web ページを分析する必要があります。

ブラウザを開いて www.kuwo.cn にアクセスし、検索バーに曲名を入力して検索すると、Web ページが検索結果ページにジャンプすることがわかります。検索結果ページでは、曲名、アーティスト、再生時間など、各曲の関連情報が表示されます。 Scrapy を通じてリクエストを送信し、検索結果ページを解析して各曲の詳細情報を取得する必要があります。

クローラ コードでは、次の 2 つのメソッドを実装する必要があります:

def start_requests(self):
    ...
    
def parse(self, response):
    ...

そのうち、start_requests() メソッドは最初の Web ページ リクエストの送信に使用され、解析メソッドは parse です。 () はコールバック関数として指定され、parse() メソッドは Web ページの解析、データの抽出、応答の処理に使用されます。具体的なコードは次のとおりです。

class KuwoSpider(RedisSpider):
    name = 'kuwo'
    allowed_domains = ['kuwo.cn']
    redis_cli = get_redis_from_settings(get_project_settings())

    def start_requests(self):
        keywords = ['爱情', '妳太善良', '说散就散']
        # 搜索结果页面的url
        for keyword in keywords:
            url = f'http://www.kuwo.cn/search/list?key={keyword}&rformat=json&ft=music&encoding=utf8&rn=8&pn=1'
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        data = json.loads(response.text)
        # 获取搜索结果页面的每个歌曲信息
        song_list = data['data']['list']
        for song in song_list:
            music_id = song['musicrid'][6:]
            song_name = song['name']
            singer_name = song['artist']
            album_name = song['album']

            # 根据歌曲id获取歌曲详细信息
            url = f'http://www.kuwo.cn/url?format=mp3&rid=MUSIC_{music_id}&response=url&type=convert_url3&br=128kmp3&from=web&t=1639056420390&httpsStatus=1&reqId=6be77da1-4325-11ec-b08e-11263642326e'
            meta = {'song_name': song_name, 'singer_name': singer_name, 'album_name': album_name}
            yield scrapy.Request(url=url, callback=self.parse_song, meta=meta)

    def parse_song(self, response):
        item = KuwoMusicItem()
        item['song_name'] = response.meta.get('song_name')
        item['singer_name'] = response.meta.get('singer_name')
        item['album_name'] = response.meta.get('album_name')
        item['song_url'] = response.text.strip()
        yield item

上記のコードでは、まず start_requests() メソッドで検索する曲のキーワードを定義し、各曲の検索結果ページの URL を構築してリクエストを送信します。 parse() メソッドでは、検索結果ページを解析し、曲名、アーティスト、アルバムなど、各曲に関する関連情報を抽出します。次に、各曲の ID に基づいて、対応する曲情報を取得するための URL を構築し、Scrapy のメタデータ (メタ) メカニズムを使用して、曲名、歌手、アルバムなどの情報を転送します。最後に、曲情報ページを解析し、parse_song() メソッドで曲の再生アドレスを抽出し、カスタム KuwoMusicItem オブジェクトに出力します。

5. データ ストレージと使用

上記のコードでは、クロールされた曲情報を保存するカスタム KuwoMusicItem オブジェクトを定義します。ツール クラス RedisPipeline を使用して、クロールされたデータを Redis データベースに保存できます:

ITEM_PIPELINES = {
    'kuwo_music.pipelines.RedisPipeline': 300,
}

同時に、ツール クラス JsonLinesItemExporter を使用してデータをローカル CSV ファイルに保存することもできます:

from scrapy.exporters import JsonLinesItemExporter
import csv

class CsvPipeline(object):
    # 将数据存储到csv文件
    def __init__(self):
        self.file = open('kuwo_music.csv', 'w', encoding='utf-8', newline='')
        self.exporter = csv.writer(self.file)
        self.exporter.writerow(['song_name', 'singer_name', 'album_name', 'song_url'])

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        self.exporter.writerow([item['song_name'], item['singer_name'], item['album_name'], item['song_url']])
        return item

最後に、コマンド ラインで次のコマンドを実行して Scrapy クローラーを開始します:

scrapy crawl kuwo

上記は、Scrapy フレームワークを使用して Kugou Music の曲情報をクロールする方法の詳細な紹介です。参考にしていただければ幸いです。

以上がScrapy を使用して Kugou Music の曲をクロールする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。