Rumah > Artikel > pembangunan bahagian belakang > Analisis alat pengekstrak pautan dan deduplikasi dalam Scrapy
Scrapy ialah rangka kerja perangkak Python yang sangat baik. Ia menyokong ciri lanjutan seperti konkurensi, pengedaran dan ketidaksegerakan, dan boleh membantu pembangun merangkak data di Internet dengan lebih pantas dan stabil. Dalam Scrapy, pengekstrak pautan dan alat penyahduplikasi adalah komponen yang sangat penting untuk membantu perangkak dalam melengkapkan penangkapan dan pemprosesan data automatik. Artikel ini akan menganalisis alat pengekstrak pautan dan penyahduplikasi dalam Scrapy, meneroka cara ia dilaksanakan dan aplikasinya dalam proses rangkak Scrapy.
1. Fungsi dan pelaksanaan pengekstrak pautan
Pautan Extractor ialah alat dalam rangka kerja perangkak Scrapy yang mengekstrak pautan URL secara automatik. Dalam proses perangkak yang lengkap, selalunya perlu untuk mengekstrak beberapa pautan URL daripada halaman web, dan kemudian mengakses dan memprosesnya lagi berdasarkan pautan ini. Pengekstrak pautan digunakan untuk melaksanakan proses ini Ia boleh mengekstrak pautan secara automatik dari halaman web mengikut beberapa peraturan, dan menyimpan pautan ini ke baris gilir permintaan Scrapy untuk pemprosesan seterusnya.
Dalam Scrapy, pengekstrak pautan melakukan pemadanan melalui ungkapan biasa atau ungkapan XPath. Scrapy menyediakan dua pengekstrak pautan: LinkExtractor berdasarkan ungkapan biasa dan LxmlLinkExtractor berdasarkan ungkapan XPath.
LinkExtractor berasaskan ungkapan biasa boleh mengekstrak pautan yang dipadankan secara automatik dengan melakukan pemadanan biasa pada URL dalam halaman web. Sebagai contoh, jika kami ingin mengekstrak semua pautan bermula dengan http://example.com/ daripada halaman web, kami boleh menggunakan kod berikut:
from scrapy.linkextractors import LinkExtractor link_extractor = LinkExtractor(allow=r'^http://example.com/') links = link_extractor.extract_links(response)
Parameter allow menentukan ungkapan biasa untuk memadankan semua pautan bermula dengan http Pautan bermula dengan ://example.com/. Kaedah extract_links() boleh mengekstrak semua pautan yang berjaya dipadankan dan menyimpannya dalam senarai objek Pautan.
Objek Pautan ialah struktur data yang digunakan untuk mewakili pautan dalam rangka kerja Scrapy, yang mengandungi maklumat seperti URL pautan, tajuk, teks sauh dan jenis pautan. Melalui objek ini, kami boleh mendapatkan pautan yang diperlukan dengan mudah dan memproses serta mengaksesnya dengan mudah dalam perangkak Scrapy.
LxmlLinkExtractor berdasarkan ungkapan XPath boleh mengekstrak padanan yang berjaya secara automatik dengan memadankan ungkapan XPath pada teg HTML dalam Pautan halaman web. Contohnya, jika kita ingin mengekstrak semua pautan dengan atribut kelas yang sama dengan "pautan cerita" daripada halaman web, kita boleh menggunakan kod berikut:
from scrapy.linkextractors import LxmlLinkExtractor link_extractor = LxmlLinkExtractor(restrict_xpaths='//a[@class="storylink"]') links = link_extractor.extract_links(response)
parameter restrict_xpaths menentukan ungkapan XPath untuk memadankan semua atribut kelas yang sama. kepada "pautan cerita" " tag. LxmlLinkExtractor digunakan sama seperti LinkExtractor, dan boleh menyimpan pautan yang diekstrak dalam senarai objek Pautan. Perlu diingatkan bahawa memandangkan LxmlLinkExtractor menggunakan perpustakaan lxml untuk penghuraian HTML, kod berikut perlu ditambahkan pada fail konfigurasi projek:
# settings.py DOWNLOAD_HANDLERS = { 's3': None, }
Kod di atas boleh melumpuhkan pemuat turun lalai dalam Scrapy dan menggunakan perpustakaan lxml .
2. Peranan dan pelaksanaan alatan deduplikasi
Apabila merangkak Web, deduplikasi pautan adalah sangat penting, kerana dalam kebanyakan kes, pautan yang berbeza ke halaman web yang sama adalah Ia akan muncul berulang kali. Jika pendua tidak dialih keluar, ia akan menyebabkan masalah merangkak berulang dan membazir lebar jalur dan masa. Oleh itu, Penapis Pendua telah diperkenalkan dalam Scrapy untuk menandakan dan menilai pautan yang telah dirangkak untuk mengelakkan lawatan berulang.
Prinsip alat deduplikasi adalah untuk menyimpan pautan URL yang dilawati ke dalam struktur data, dan kemudian menilai sama ada pautan URL baharu itu telah dilawati, pautan URL akan dibuang, jika tidak tambahkannya pada baris gilir permintaan perangkak. Scrapy mempunyai banyak alat penyahduplikasi terbina dalam, termasuk penyahduplikasi Set berasaskan memori, penyahduplikasi SQLite3 berasaskan cakera dan penyahduplikasi berasaskan Redis. Penyahduplikator yang berbeza mempunyai senario terpakai yang berbeza Mari kita ambil penyahduplikator Redis sebagai contoh untuk menggambarkan.
Redis ialah pangkalan data dalam memori NoSQL berprestasi tinggi yang boleh menyokong ciri lanjutan seperti pengedaran, ketekunan dan struktur data yang kaya. Sangat sesuai untuk melaksanakan alat deduplikasi Scrapy. Penyahduplikator Redis dalam Scrapy boleh menandakan pautan URL yang telah dilawati untuk mengelakkan lawatan berulang.
Scrapy menggunakan penyahduplikat kelas Set berasaskan memori secara lalai Jika anda perlu menggunakan penyahduplikator Redis, anda boleh menambah kod berikut pada fail konfigurasi projek:
# settings.py DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_HOST = "localhost" REDIS_PORT = 6379
Antaranya, yang. Parameter DUPEFILTER_CLASS Menentukan strategi penyahduplikasian yang digunakan oleh alat penyahduplikasian Di sini kami menggunakan scrapy_redis.dupefilter.RFPDupeFilter, yang dilaksanakan berdasarkan struktur data yang ditetapkan Redis.
Parameter SCHEDULER menentukan strategi penjadualan yang digunakan oleh penjadual Di sini kami menggunakan scrapy_redis.scheduler.Scheduler, yang dilaksanakan berdasarkan struktur data set diisih bagi Redis.
Parameter SCHEDULER_PERSIST menentukan sama ada penjadual perlu dikekalkan dalam Redis, iaitu sama ada ia perlu menyimpan keadaan rangkak terakhir untuk mengelakkan merangkak semula URL yang telah dirangkak.
Parameter REDIS_HOST dan REDIS_PORT masing-masing menentukan alamat IP dan nombor port pangkalan data Redis Jika pangkalan data Redis bukan setempat, anda perlu menetapkan alamat IP yang sepadan.
使用Redis去重器之后,需要在爬虫中添加redis_key参数,用来指定Redis中保存URL链接的key名。例如:
# spider.py class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://example.com'] custom_settings = { 'REDIS_HOST': 'localhost', 'REDIS_PORT': 6379, 'DUPEFILTER_CLASS': 'scrapy_redis.dupefilter.RFPDupeFilter', 'SCHEDULER': 'scrapy_redis.scheduler.Scheduler', 'SCHEDULER_PERSIST': True, 'SCHEDULER_QUEUE_CLASS': 'scrapy_redis.queue.SpiderPriorityQueue', 'REDIS_URL': 'redis://user:pass@localhost:6379', 'ITEM_PIPELINES': { 'scrapy_redis.pipelines.RedisPipeline': 400, }, 'DOWNLOADER_MIDDLEWARES': { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'scrapy_useragents.downloadermiddlewares.useragents.UserAgentsMiddleware': 500, }, 'FEED_URI': 'result.json', 'FEED_FORMAT': 'json', 'LOG_LEVEL': 'INFO', 'SPIDER_MIDDLEWARES': { 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 300, } } def __init__(self, *args, **kwargs): domain = kwargs.pop('domain', '') self.allowed_domains = filter(None, domain.split(',')) self.redis_key = '%s:start_urls' % self.name super(MySpider, self).__init__(*args, **kwargs) def parse(self, response): pass
以上是一个简单的爬虫示例,redis_key参数指定了在Redis中保存URL链接的键名为myspider:start_urls。在parse()方法中,需要编写自己的网页解析代码,提取出需要的信息。
三、总结
链接提取器和去重工具是Scrapy爬虫框架中非常重要的组件,它们可以大大简化我们编写爬虫的工作,并提高爬虫的效率。在使用Scrapy爬虫时,我们可以根据自己的需求选择不同的链接提取器和去重工具,从而实现更为高效和灵活的爬虫功能。
Atas ialah kandungan terperinci Analisis alat pengekstrak pautan dan deduplikasi dalam Scrapy. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!