首頁 >後端開發 >Python教學 >怎樣用Scrapy爬取酷狗音樂的歌曲呢?

怎樣用Scrapy爬取酷狗音樂的歌曲呢?

PHPz
PHPz原創
2023-06-22 22:59:212764瀏覽

隨著網路的發展,網路上的資訊量越來越大,人們需要爬取不同網站上的資訊來進行各種分析和挖掘。而Scrapy是一個功能完整的Python爬蟲框架,它可以自動化爬取網站數據,並以結構化的形式輸出。酷狗音樂是廣受歡迎的線上音樂平台之一,以下我將介紹如何使用Scrapy來完成酷狗音樂的歌曲資訊爬取。

1. 安裝Scrapy

Scrapy是基於Python語言的框架,所以首先需要設定好Python環境。在安裝Scrapy之前,需要先安裝好Python和pip工具。安裝完成後,即可透過以下指令來安裝Scrapy:

pip install scrapy

2. 新建Scrapy專案

Scrapy提供了一套指令列工具來方便我們建立新的項目。在命令列中輸入以下程式碼:

scrapy startproject kuwo_music

執行後,將會在目前目錄下建立一個名為「kuwo_music」的Scrapy專案。在這個專案中,我們需要新建一個爬蟲來完成對酷狗音樂的歌曲訊息爬取。

3. 新爬蟲

在Scrapy專案中,爬蟲是用來抓取和解析特定網站資料的程式。在「kuwo_music」專案目錄下,執行以下指令:

scrapy genspider kuwo www.kuwo.cn 

上述指令會在「kuwo_music/spiders」目錄下建立一個名為「kuwo.py」的文件,該檔案即為我們的爬蟲程序代碼。我們需要在該文件中定義網站資料的抓取和解析過程。

4. 網站請求與頁面解析

在新建的「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框架提供的各種工具類別和方法,以及專案中的自訂模組。在繼續編寫爬蟲程式碼之前,我們需要先分析酷狗音樂歌曲資訊所在的網頁。

開啟瀏覽器,造訪www.kuwo.cn,在搜尋欄中輸入歌曲名稱並蒐索,會發現網頁跳到搜尋結果頁面。在搜尋結果頁面中,可以看到每首歌曲的相關訊息,如歌曲名稱、歌手、播放時間等。我們需要透過Scrapy發送請求,並解析搜尋結果頁面,以取得每首歌曲的詳細資訊。

在爬蟲程式碼中,我們需要實作以下兩個方法:

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

其中,start_requests()方法用來傳送初始網頁請求,並將解析方法parse()指定為回調函數;而parse()方法則用來解析網頁、擷取數據,並處理回應。具體程式碼如下:

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的元資料(meta)機制傳遞歌曲名稱、歌手、專輯等資訊。最後,我們在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框架來完成對酷狗音樂的歌曲信息爬取的詳細介紹,希望能為大家提供一些參考和幫助。

以上是怎樣用Scrapy爬取酷狗音樂的歌曲呢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn