Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana cara menggunakan Scrapy untuk merangkak data Zhihu?

Bagaimana cara menggunakan Scrapy untuk merangkak data Zhihu?

王林
王林asal
2023-06-22 14:51:151629semak imbas

Scrapy ialah alat perangkak web Python yang boleh membantu kami mendapatkan pelbagai data dengan mudah di Internet. Zhihu ialah platform Soal Jawab sosial yang popular Gunakan Scrapy untuk menangkap soalan, jawapan, maklumat pengguna dan data lain dengan cepat di Zhihu. Artikel ini akan memperkenalkan cara menggunakan Scrapy untuk merangkak data Zhihu.

  1. Memasang Scrapy

Mula-mula anda perlu memasang Scrapy. Anda boleh menggunakan arahan pip untuk memasang terus:

pip install scrapy
  1. Buat projek Scrapy

Masukkan direktori tempat anda ingin mencipta projek Scrapy dalam terminal dan gunakan yang berikut arahan untuk mencipta projek:

scrapy startproject zhihu

Arahan ini akan mencipta projek Scrapy bernama "zhihu" dalam direktori semasa.

  1. Cipta Spider

Gunakan arahan berikut untuk mencipta fail Spider bernama "zhihu_spider.py" dalam direktori projek:

scrapy genspider zhihu_spider zhihu.com

Arahan ini akan Cipta fail "zhihu_spider.py" dalam subdirektori "spiders" di bawah direktori projek Fail ini mengandungi Spider dengan zhihu.com sebagai URL permulaan.

  1. Tulis kod Spider

Buka fail "zhihu_spider.py" dan tambah kod berikut:

import scrapy

class ZhihuSpider(scrapy.Spider):
    name = 'zhihu'
    allowed_domains = ['zhihu.com']
    start_urls = ['https://www.zhihu.com/']

    def parse(self, response):
        pass

Kod mentakrifkan fail bernama "ZhihuSpider "Kelas labah-labah. Kelas Spider perlu mentakrifkan atribut berikut:

  • nama: Nama labah-labah
  • domain_yang dibenarkan: Nama domain dilawati
  • start_urls: URL permulaan Spider

Dalam contoh ini, URL permulaan Spider ditetapkan kepada zhihu.com. Spider juga mesti mengandungi kaedah yang dipanggil "parse" untuk memproses data yang dikembalikan oleh respons. Dalam contoh ini, kaedah "parse" belum dilaksanakan, jadi pernyataan "lulus" kosong ditambahkan dahulu.

  1. Menghuraikan data halaman

Selepas mencipta Spider, anda perlu menambah kod untuk menghuraikan data halaman. Dalam kaedah "parse", gunakan kod berikut:

def parse(self, response):
        questions = response.css('div[data-type="question"]')
        for question in questions:
            yield {
                'question': question.css('h2 a::text').get(),
                'link': question.css('h2 a::attr(href)').get(),
                'answers': question.css('div.zm-item-answer::text').getall(),
            }

Kod ini mendapat elemen div dalam halaman yang mengandungi atribut "jenis data" tanpa "soalan". Kemudian, gelung melalui setiap elemen div untuk mengekstrak tajuk soalan, pautan dan senarai jawapan.

Dalam kod di atas, "hasil" ialah kata kunci dalam bahasa Python yang digunakan untuk menjana penjana. Penjana ialah lelaran yang mengandungi elemen Selepas setiap elemen dikembalikan, pelaksanaan dijeda pada kedudukan elemen tersebut. Dalam Scrapy, kata kunci "hasil" digunakan untuk mengembalikan data yang dihuraikan daripada halaman ke dalam Scrapy.

  1. Jalankan perangkak

Selepas anda selesai menulis kod, gunakan arahan berikut untuk menjalankan perangkak dalam terminal:

scrapy crawl zhihu

Arahan ini akan lancarkan rangka kerja Scrapy dan mulakan data Crawling Zhihu. Scrapy secara automatik akan mengakses URL permulaan yang dinyatakan dalam Spider dan menghuraikan data halaman yang dikembalikan melalui kaedah "parse". Data yang dihuraikan akan dikeluarkan ke terminal. Jika anda perlu menyimpan data, anda boleh menyimpan data dalam fail CSV, JSON, dsb.

  1. Merangkak data pengguna

Kod di atas hanya boleh merangkak soalan, jawapan dan data lain, tetapi tidak boleh mendapatkan maklumat pengguna. Jika anda perlu merangkak data pengguna, anda perlu menggunakan antara muka API Zhihu. Dalam Spider, anda boleh menggunakan kod berikut untuk mendapatkan data format JSON yang dikembalikan oleh antara muka API:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
url = f'https://www.zhihu.com/api/v4/members/{user}?include=following_count,follower_count,badge[?(type=best_answerer)].topics&limit=20'
yield scrapy.Request(url, headers=headers, callback=self.parse_user)

Kod ini memperoleh maklumat pengguna yang ditentukan daripada antara muka API. Di sini, rentetan berformat f-string digunakan untuk memasukkan nama pengguna pengguna yang akan diperolehi ke dalam URL.

Dalam fungsi panggil balik, gunakan kod berikut untuk mengekstrak data yang diperlukan daripada data format JSON:

def parse_user(self, response):
        data = json.loads(response.body)['data']
        following_count = data['following_count']
        follower_count = data['follower_count']
        best_answerer = data['badge'][0]['topics']
        yield {
            'user_id': data['id'],
            'name': data['name'],
            'headline': data['headline'],
            'following_count': following_count,
            'follower_count': follower_count,
            'best_answerer': best_answerer,
        }

Kod ini mengekstrak ID pengguna, nama panggilan pengguna, avatar dan ikut daripada JSON data Nombor, bilangan peminat, soalan jawapan terbaik dan data lain.

  1. Ringkasan

Artikel ini memperkenalkan cara menggunakan Scrapy untuk merangkak data Zhihu. Pertama, anda perlu membuat projek Scrapy dan mencipta Spider. Kemudian, gunakan pemilih CSS untuk menghuraikan data dalam halaman dan menyimpan data yang dirangkak dalam penjana. Akhir sekali, simpannya dalam fail CSV, JSON, dsb., atau keluarkan terus ke terminal. Jika anda perlu mendapatkan data pengguna, anda boleh menggunakan antara muka API Zhihu untuk mengekstrak data yang berkaitan daripada data JSON.

Atas ialah kandungan terperinci Bagaimana cara menggunakan Scrapy untuk merangkak data Zhihu?. 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