Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan Scrapy untuk merangkak lagu-lagu Kugou Music?

Bagaimana untuk menggunakan Scrapy untuk merangkak lagu-lagu Kugou Music?

PHPz
PHPzasal
2023-06-22 22:59:212721semak imbas

Dengan perkembangan Internet, jumlah maklumat di Internet semakin meningkat, dan orang ramai perlu merangkak maklumat daripada tapak web yang berbeza untuk melakukan pelbagai analisis dan perlombongan. Scrapy ialah rangka kerja perangkak Python berfungsi sepenuhnya yang boleh merangkak data tapak web secara automatik dan mengeluarkannya dalam bentuk berstruktur. Kugou Music adalah salah satu platform muzik dalam talian yang paling popular Di bawah saya akan memperkenalkan cara menggunakan Scrapy untuk merangkak maklumat lagu Kugou Music.

1. Pasang Scrapy

Scrapy ialah rangka kerja berdasarkan bahasa Python, jadi anda perlu mengkonfigurasi persekitaran Python terlebih dahulu. Sebelum memasang Scrapy, anda perlu memasang Python dan alat pip terlebih dahulu. Selepas pemasangan selesai, anda boleh memasang Scrapy melalui arahan berikut:

pip install scrapy

2 Cipta projek Scrapy baharu

Scrapy menyediakan satu set alat baris arahan untuk. memudahkan kami membuat projek baru. Masukkan kod berikut dalam baris arahan:

scrapy startproject kuwo_music

Selepas pelaksanaan, projek Scrapy bernama "kuwo_music" akan dibuat dalam direktori semasa. Dalam projek ini, kami perlu mencipta perangkak baharu untuk merangkak maklumat lagu Muzik Kugou.

3. Buat perangkak baharu

Dalam projek Scrapy, perangkak ialah program yang digunakan untuk merangkak dan menghuraikan data tapak web tertentu. Dalam direktori projek "kuwo_music", laksanakan arahan berikut:

scrapy genspider kuwo www.kuwo.cn 

Arahan di atas akan mencipta fail bernama "kuwo.py" dalam direktori "kuwo_music/spiders", iaitu kod program perangkak kami. Kami perlu mentakrifkan proses rangkak dan penghuraian data tapak web dalam fail ini.

4. Permintaan tapak web dan penghuraian halaman

Dalam fail "kuwo.py" yang baru dibuat, anda perlu mengimport modul yang diperlukan:

rreee

Melalui kod di atas, kami boleh menggunakan pelbagai kelas alat dan kaedah yang disediakan oleh rangka kerja Scrapy, serta modul tersuai dalam projek. Sebelum meneruskan menulis kod perangkak, kita perlu menganalisis dahulu halaman web di mana maklumat lagu Kugou Music berada.

Buka penyemak imbas, lawati www.kuwo.cn, masukkan nama lagu dalam bar carian dan cari, anda akan mendapati halaman web melompat ke halaman hasil carian. Dalam halaman hasil carian, anda boleh melihat maklumat yang berkaitan tentang setiap lagu, seperti nama lagu, artis, masa bermain, dsb. Kami perlu menghantar permintaan melalui Scrapy dan menghuraikan halaman hasil carian untuk mendapatkan butiran setiap lagu.

Dalam kod perangkak, kita perlu melaksanakan dua kaedah berikut:

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

Antaranya, kaedah start_requests() digunakan untuk menghantar permintaan halaman web awal, dan menghurai kaedah parsing () ditetapkan sebagai fungsi panggil balik; dan kaedah parse() digunakan untuk menghuraikan halaman web, mengekstrak data dan memproses respons. Kod khusus adalah seperti berikut:

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

Dalam kod di atas, kami mula-mula menentukan kata kunci lagu untuk dicari dalam kaedah start_requests(), bina URL setiap halaman hasil carian lagu dan hantar permintaan. Dalam kaedah parse(), kami menghuraikan halaman hasil carian dan mengekstrak maklumat yang berkaitan tentang setiap lagu, termasuk nama lagu, artis, album, dsb. Kemudian, berdasarkan id setiap lagu, kami membina URL untuk mendapatkan maklumat lagu yang sepadan, dan menggunakan mekanisme metadata (meta) Scrapy untuk memindahkan nama lagu, penyanyi, album dan maklumat lain. Akhir sekali, kami menghuraikan halaman maklumat lagu dan mengekstrak alamat main balik lagu dalam kaedah parse_song(), dan mengeluarkannya ke objek KuwoMusicItem tersuai.

5. Penyimpanan dan penggunaan data

Dalam kod di atas, kami mentakrifkan objek KuwoMusicItem tersuai untuk menyimpan maklumat lagu yang dirangkak. Kita boleh menggunakan kelas alat RedisPipeline untuk menyimpan data yang dirangkak ke dalam pangkalan data Redis:

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

Pada masa yang sama, kita juga boleh menggunakan kelas alat JsonLinesItemExporter untuk menyimpan data dalam fail csv setempat:

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

Akhir sekali, laksanakan arahan berikut pada baris arahan untuk memulakan perangkak Scrapy:

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

Di atas adalah pengenalan terperinci tentang cara menggunakan rangka kerja Scrapy untuk merangkak maklumat lagu Kugou Music harap ia dapat memberi anda Sedikit rujukan dan bantuan.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan Scrapy untuk merangkak lagu-lagu Kugou Music?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn