Rangka kerja Scrapy ialah rangka kerja perangkak Python sumber terbuka yang boleh digunakan untuk mencipta dan mengurus aplikasi yang merangkak data Ia merupakan salah satu rangka kerja perangkak paling popular pada masa ini. Rangka kerja Scrapy menggunakan IO tak segerak untuk permintaan rangkaian, yang boleh menangkap data tapak web dengan cekap dan mempunyai kelebihan kebolehskalaan dan kestabilan.
Artikel ini akan menganalisis secara mendalam ciri dan kelebihan rangka kerja Scrapy, dan menggambarkan operasinya yang cekap dan stabil melalui contoh kod khusus.
Rangka kerja Scrapy menggunakan bahasa Python, yang mudah dipelajari dan mempunyai halangan kemasukan yang rendah. Pada masa yang sama, ia juga menyediakan dokumentasi lengkap dan kod sampel untuk memudahkan pengguna bermula dengan cepat. Berikut ialah contoh perangkak Scrapy mudah yang boleh digunakan untuk mendapatkan tajuk dan pautan soalan popular tentang Zhihu:
import scrapy class ZhihuSpider(scrapy.Spider): name = "zhihu" # 爬虫名 start_urls = [ 'https://www.zhihu.com/hot' ] # 起始网站链接 def parse(self, response): for question in response.css('.HotItem'): yield { 'title': question.css('h2::text').get(), 'link': question.css('a::attr(href)').get() }
Dalam kod di atas, program perangkak bernama "zhihu" ditakrifkan dengan mewarisi kelas scrapy.Spider. Atribut start_urls ditakrifkan dalam kelas dan pautan tapak web untuk dirangkak dinyatakan dalam senarai. Kaedah parse() ditakrifkan untuk menghuraikan respons dan mendapatkan tajuk dan pautan soalan popular melalui pemilih CSS, dan mengembalikan hasilnya sebagai hasil kamus.
Rangka kerja Scrapy menggunakan IO tak segerak untuk permintaan rangkaian Ia boleh menghantar berbilang permintaan tak segerak pada masa yang sama dan mengembalikan semua respons dengan serta-merta. Kaedah ini sangat meningkatkan kelajuan dan kecekapan crawler. Berikut ialah contoh kod permintaan asynchronous Scrapy yang mudah:
import asyncio import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): urls = [ 'https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com' ] tasks = [] for url in urls: tasks.append(asyncio.ensure_future(fetch(url))) responses = await asyncio.gather(*tasks) print(responses) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
Dalam kod di atas, kaedah permintaan tak segerak dilaksanakan melalui perpustakaan asyncio dan perpustakaan aiohttp. Fungsi asynchronous fetch() ditakrifkan untuk menghantar permintaan, dan perpustakaan aiohttp digunakan untuk melaksanakan klien HTTP tak segerak. Fungsi tak segerak utama() ditakrifkan untuk memproses url, objek Masa Depan yang dikembalikan oleh fetch() ditambah pada senarai tugasan, dan akhirnya fungsi asyncio.gather() digunakan untuk mendapatkan hasil pemulangan semua tugasan.
Rangka kerja Scrapy menyediakan antara muka sambungan yang kaya dan pemalam Pengguna boleh menambah perisian tengah tersuai, talian paip, pemuat turun, dsb., dengan itu memanjangkan fungsi dan prestasinya. Berikut ialah contoh perisian tengah Scrapy yang mudah:
from scrapy import signals class MyMiddleware: @classmethod def from_crawler(cls, crawler): o = cls() crawler.signals.connect(o.spider_opened, signal=signals.spider_opened) crawler.signals.connect(o.spider_closed, signal=signals.spider_closed) return o def spider_opened(self, spider): spider.logger.info('常规中间件打开: %s', spider.name) def spider_closed(self, spider): spider.logger.info('常规中间件关闭: %s', spider.name) def process_request(self, request, spider): spider.logger.info('常规中间件请求: %s %s', request.method, request.url) return None def process_response(self, request, response, spider): spider.logger.info('常规中间件响应: %s %s', str(response.status), response.url) return response def process_exception(self, request, exception, spider): spider.logger.error('常规中间件异常: %s %s', exception, request.url) return None
Dalam kod di atas, kelas perisian tengah MyMiddleware ditakrifkan. Fungsi from_crawler() khas ditakrifkan dalam kelas untuk mengendalikan sambungan isyarat program crawler. Fungsi spider_opened() dan spider_closed() ditakrifkan untuk mengendalikan isyarat pembukaan dan penutupan perangkak. Fungsi process_request() dan process_response() ditakrifkan untuk memproses permintaan dan isyarat tindak balas. Fungsi process_exception() ditakrifkan untuk mengendalikan maklumat pengecualian.
Rangka kerja Scrapy sangat boleh dikonfigurasikan dan boleh laras, dan boleh melaraskan butiran perangkak mengikut keperluan pengguna, dengan itu meningkatkan kestabilan dan keteguhan perangkak rangka kerja Scrapy. Berikut ialah contoh kelewatan muat turun Scrapy dan konfigurasi tamat masa:
DOWNLOAD_DELAY = 3 DOWNLOAD_TIMEOUT = 5
Dalam kod di atas, dengan menetapkan parameter DOWNLOAD_DELAY kepada 3, ini bermakna anda perlu menunggu 3 saat antara setiap dua muat turun. Dengan menetapkan parameter DOWNLOAD_TIMEOUT kepada 5, ini bermakna jika tiada respons diterima dalam masa 5 saat, ia akan tamat masa dan keluar.
Ringkasan
Rangka kerja Scrapy ialah rangka kerja perangkak Python yang cekap, berskala dan stabil dengan kelebihan pembelajaran mudah, IO tak segerak, kebolehskalaan dan kestabilan. Artikel ini memperkenalkan ciri utama dan kelebihan rangka kerja Scrapy melalui contoh kod tertentu. Bagi pengguna yang ingin membangunkan aplikasi perangkak yang cekap dan stabil, rangka kerja Scrapy sudah pasti merupakan pilihan yang baik.
Atas ialah kandungan terperinci Analisis mendalam tentang ciri-ciri dan kelebihan rangka kerja scrapy. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!