インターネットの発展に伴い、インターネット上の情報量は増加しており、さまざまな分析やマイニングを行うために、さまざまな 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 サイトの他の関連記事を参照してください。