Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse der Link-Extraktor- und Deduplizierungstools in Scrapy

Analyse der Link-Extraktor- und Deduplizierungstools in Scrapy

WBOY
WBOYOriginal
2023-06-22 09:17:271587Durchsuche

Scrapy ist ein hervorragendes Python-Crawler-Framework. Es unterstützt erweiterte Funktionen wie Parallelität, Verteilung und Asynchronität, die Entwicklern dabei helfen können, Daten im Internet schneller und stabiler zu crawlen. In Scrapy sind Link-Extraktoren und Deduplizierungstools sehr wichtige Komponenten, die Crawler bei der automatisierten Datenerfassung und -verarbeitung unterstützen. In diesem Artikel werden die Link-Extraktions- und Deduplizierungstools in Scrapy analysiert, ihre Implementierung und ihre Anwendung im Scrapy-Crawling-Prozess untersucht.

1. Die Funktion und Implementierung des Link-Extraktors

Link Extractor ist ein Tool im Scrapy-Crawler-Framework, das automatisch URL-Links extrahiert. In einem vollständigen Crawler-Prozess ist es häufig erforderlich, einige URL-Links aus der Webseite zu extrahieren und sie dann basierend auf diesen Links weiter abzurufen und zu verarbeiten. Der Link-Extraktor wird zur Implementierung dieses Prozesses verwendet. Er kann gemäß einigen Regeln automatisch Links von Webseiten extrahieren und diese Links zur späteren Verarbeitung in der Anforderungswarteschlange von Scrapy speichern.

In Scrapy führt der Link-Extraktor den Abgleich über reguläre Ausdrücke oder XPath-Ausdrücke durch. Scrapy bietet zwei Link-Extraktoren: LinkExtractor basierend auf regulären Ausdrücken und LxmlLinkExtractor basierend auf XPath-Ausdrücken.

  1. LinkExtractor basierend auf regulären Ausdrücken

LinkExtractor basierend auf regulären Ausdrücken kann automatisch erfolgreich übereinstimmende Links extrahieren, indem es einen regelmäßigen Abgleich von URLs in Webseiten durchführt. Wenn wir beispielsweise alle Links, die mit http://example.com/ beginnen, von einer Webseite extrahieren möchten, können wir den folgenden Code verwenden: Der Parameter

from scrapy.linkextractors import LinkExtractor

link_extractor = LinkExtractor(allow=r'^http://example.com/')
links = link_extractor.extract_links(response)

allow gibt einen regulären Ausdruck an, der alle Links abgleicht, die mit http:/ beginnen. /example Links beginnend mit .com/. Die Methode extract_links() kann alle erfolgreich abgeglichenen Links extrahieren und in einer Liste von Link-Objekten speichern.

Link-Objekt ist eine Datenstruktur, die zur Darstellung von Links im Scrapy-Framework verwendet wird und Informationen wie die URL des Links, den Titel, den Ankertext und den Linktyp enthält. Über diese Objekte können wir problemlos die erforderlichen Links erhalten und sie im Scrapy-Crawler weiterverarbeiten und darauf zugreifen.

  1. LxmlLinkExtractor basierend auf XPath-Ausdrücken

LxmlLinkExtractor basierend auf XPath-Ausdrücken kann automatisch erfolgreich übereinstimmende Links extrahieren, indem XPath-Ausdrücke mit HTML-Tags in Webseiten abgeglichen werden. Wenn wir beispielsweise alle A-Links mit Klassenattributen gleich „storylink“ von einer Webseite extrahieren möchten, können wir den folgenden Code verwenden: Der Parameter

from scrapy.linkextractors import LxmlLinkExtractor

link_extractor = LxmlLinkExtractor(restrict_xpaths='//a[@class="storylink"]')
links = link_extractor.extract_links(response)

restrict_xpaths gibt einen XPath-Ausdruck an, der alle A-Tags mit Klassenattributen gleich abgleicht „Storylink“ . LxmlLinkExtractor wird ähnlich wie LinkExtractor verwendet und kann die extrahierten Links in einer Liste von Link-Objekten speichern. Es ist zu beachten, dass, da LxmlLinkExtractor die lxml-Bibliothek für die HTML-Analyse verwendet, der folgende Code zur Konfigurationsdatei des Projekts hinzugefügt werden muss:

# settings.py
DOWNLOAD_HANDLERS = {
    's3': None,
}

Der obige Code kann den Standard-Downloader in Scrapy deaktivieren und den HTML-Parser der lxml-Bibliothek verwenden.

2. Die Rolle und Implementierung von Deduplizierungstools

Beim Crawlen des Webs ist die Linkdeduplizierung sehr wichtig, da in den meisten Fällen verschiedene Links zur gleichen Webseite wiederholt angezeigt werden Probleme verursachen und Bandbreite und Zeit verschwenden. Daher wurde in Scrapy der Duplikatfilter eingeführt, um die gecrawlten Links zu markieren und zu beurteilen und so wiederholte Besuche zu vermeiden.

Das Prinzip des Deduplizierungstools besteht darin, den besuchten URL-Link in einer Datenstruktur zu speichern und dann zu beurteilen, ob der neue URL-Link besucht wurde. Wenn er besucht wurde, wird der URL-Link verworfen, andernfalls wird er verworfen . Treten Sie der Anforderungswarteschlange des Crawlers bei. Scrapy verfügt über viele integrierte Deduplizierungstools, darunter speicherbasierte Set-Deduplizierung, festplattenbasierte SQLite3-Deduplizierung und Redis-basierte Deduplizierung. Verschiedene Deduplizierer haben unterschiedliche Anwendungsszenarien. Nehmen wir zur Veranschaulichung den Redis-Deduplizierer.

  1. Redis-basiertes Deduplizierungstool

Redis ist eine leistungsstarke NoSQL-In-Memory-Datenbank, die erweiterte Funktionen wie Verteilung, Persistenz und umfangreiche Datenstrukturen unterstützen kann. Sie eignet sich sehr gut für die Implementierung des Deduplizierungstools von Scrapy. Der Redis-Deduplizierer in Scrapy kann besuchte URL-Links markieren, um wiederholte Besuche zu vermeiden.

Scrapy verwendet standardmäßig das speicherbasierte Set-Klasse-Deduplizierungsgerät. Wenn Sie das Redis-Deduplizierungsgerät verwenden müssen, können Sie der Projektkonfigurationsdatei den folgenden Code hinzufügen:

# settings.py
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
REDIS_HOST = "localhost"
REDIS_PORT = 6379

Unter anderem gibt der Parameter DUPEFILTER_CLASS das Deduplizierungstool an Verwendete Duplizierungsstrategie, hier verwenden wir scrapy_redis.dupefilter.RFPDupeFilter, das basierend auf der festgelegten Datenstruktur von Redis implementiert wird.

Der Parameter SCHEDULER gibt die vom Scheduler verwendete Planungsstrategie an. Hier verwenden wir scrapy_redis.scheduler.Scheduler, der basierend auf der sortierten Datenstruktur von Redis implementiert wird.

Der Parameter SCHEDULER_PERSIST gibt an, ob der Scheduler in Redis beibehalten werden muss, d. h. ob er den Status des letzten Crawls speichern muss, um ein erneutes Crawlen bereits gecrawlter URLs zu vermeiden.

Die Parameter REDIS_HOST und REDIS_PORT geben die IP-Adresse bzw. Portnummer der Redis-Datenbank an. Wenn die Redis-Datenbank nicht lokal ist, müssen Sie die entsprechende IP-Adresse festlegen.

使用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爬虫时,我们可以根据自己的需求选择不同的链接提取器和去重工具,从而实现更为高效和灵活的爬虫功能。

Das obige ist der detaillierte Inhalt vonAnalyse der Link-Extraktor- und Deduplizierungstools in Scrapy. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn