Maison > Article > développement back-end > Analyse des outils d'extraction de liens et de déduplication dans Scrapy
Scrapy est un excellent framework d'exploration Python qui prend en charge la concurrence, la distribution, les fonctionnalités asynchrones et autres fonctionnalités avancées, qui peuvent aider les développeurs à explorer les données sur Internet plus rapidement et de manière plus stable. Dans Scrapy, les extracteurs de liens et les outils de déduplication sont des composants très importants pour aider les robots d'exploration à effectuer la capture et le traitement automatisés des données. Cet article analysera les outils d'extraction de liens et de déduplication dans Scrapy, explorera comment ils sont implémentés et leur application dans le processus d'exploration de Scrapy.
1. La fonction et la mise en œuvre de l'extracteur de liens
Link Extractor est un outil du framework Scrapy crawler qui extrait automatiquement les liens URL. Dans un processus complet de robot d'exploration, il est souvent nécessaire d'extraire certains liens URL de la page Web, puis d'y accéder et de les traiter davantage en fonction de ces liens. L'extracteur de liens est utilisé pour mettre en œuvre ce processus. Il peut extraire automatiquement les liens des pages Web selon certaines règles et enregistrer ces liens dans la file d'attente des requêtes de Scrapy pour un traitement ultérieur.
Dans Scrapy, l'extracteur de liens effectue une correspondance via des expressions régulières ou des expressions XPath. Scrapy propose deux extracteurs de liens : LinkExtractor basé sur des expressions régulières et LxmlLinkExtractor basé sur des expressions XPath.
LinkExtractor basé sur des expressions régulières peut extraire automatiquement les liens correspondant avec succès en effectuant une correspondance régulière sur les URL des pages Web. Par exemple, si nous voulons extraire tous les liens commençant par http://example.com/ d'une page Web, nous pouvons utiliser le code suivant : Le paramètre
from scrapy.linkextractors import LinkExtractor link_extractor = LinkExtractor(allow=r'^http://example.com/') links = link_extractor.extract_links(response)
allow spécifie une expression régulière pour correspondre à tous les liens commençant par http:/ /exemple Liens commençant par .com/. La méthode extract_links() peut extraire tous les liens correspondant avec succès et les enregistrer dans une liste d'objets Link.
L'objet Link est une structure de données utilisée pour représenter les liens dans le framework Scrapy, qui contient des informations telles que l'URL du lien, le titre, le texte d'ancrage et le type de lien. Grâce à ces objets, nous pouvons facilement obtenir les liens requis, poursuivre les processus et y accéder dans le robot Scrapy.
LxmlLinkExtractor basé sur des expressions XPath peut extraire automatiquement les liens correspondant avec succès en faisant correspondre les expressions XPath sur les balises HTML des pages Web. Par exemple, si nous voulons extraire tous les liens avec des attributs de classe égaux à "storylink" d'une page Web, nous pouvons utiliser le code suivant :
from scrapy.linkextractors import LxmlLinkExtractor link_extractor = LxmlLinkExtractor(restrict_xpaths='//a[@class="storylink"]') links = link_extractor.extract_links(response)
le paramètre restrict_xpaths spécifie une expression XPath pour faire correspondre toutes les balises a avec des attributs de classe égaux à "lien d'histoire" . LxmlLinkExtractor est utilisé de la même manière que LinkExtractor et peut enregistrer les liens extraits dans une liste d'objets Link. Il convient de noter que puisque LxmlLinkExtractor utilise la bibliothèque lxml pour l'analyse HTML, le code suivant doit être ajouté au fichier de configuration du projet :
# settings.py DOWNLOAD_HANDLERS = { 's3': None, }
Le code ci-dessus peut désactiver le téléchargeur par défaut dans Scrapy et utiliser l'analyseur HTML de la bibliothèque lxml.
2. Le rôle et la mise en œuvre des outils de déduplication
Lors de l'exploration du Web, la déduplication des liens est très importante, car dans la plupart des cas, différents liens vers la même page Web apparaîtront à plusieurs reprises, si elle est lourde, cela entraînera une exploration répétée. problèmes et gaspiller de la bande passante et du temps. Par conséquent, le filtre en double a été introduit dans Scrapy pour marquer et juger les liens qui ont été explorés afin d'éviter les visites répétées.
Le principe de l'outil de déduplication est de sauvegarder le lien URL visité dans une structure de données, puis de juger si le nouveau lien URL a été visité, s'il a été visité, le lien URL sera supprimé, sinon il sera supprimé. . Rejoignez la file d'attente des requêtes du robot. Scrapy dispose de nombreux outils de déduplication intégrés, notamment la déduplication Set basée sur la mémoire, la déduplication SQLite3 basée sur le disque et la déduplication basée sur Redis. Différents déduplicateurs ont différents scénarios applicables. Prenons le déduplicateur Redis comme exemple pour illustrer.
Redis est une base de données NoSQL en mémoire hautes performances qui peut prendre en charge des fonctionnalités avancées telles que la distribution, la persistance et des structures de données riches. Elle est très adaptée à la mise en œuvre de l'outil de déduplication de Scrapy. Le déduplicateur Redis de Scrapy peut marquer les liens URL qui ont été visités pour éviter les visites répétées.
Scrapy utilise par défaut le périphérique de déduplication de classe Set basé sur la mémoire. Si vous devez utiliser le périphérique de déduplication Redis, vous pouvez ajouter le code suivant au fichier de configuration du projet :
# settings.py DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_HOST = "localhost" REDIS_PORT = 6379
Parmi eux, le paramètre DUPEFILTER_CLASS spécifie l'outil de déduplication. à utiliser. Stratégie de duplication, nous utilisons ici scrapy_redis.dupefilter.RFPDupeFilter, qui est implémenté sur la base de la structure de données définie de Redis.
Le paramètre SCHEDULER spécifie la stratégie de planification utilisée par le planificateur. Ici, nous utilisons scrapy_redis.scheduler.Scheduler, qui est implémenté sur la base de la structure de données d'ensemble triée de Redis.
Le paramètre SCHEDULER_PERSIST spécifie si le planificateur doit être persistant dans Redis, c'est-à-dire s'il doit enregistrer l'état de la dernière exploration pour éviter de réexplorer les URL qui ont déjà été explorées.
Les paramètres REDIS_HOST et REDIS_PORT spécifient respectivement l'adresse IP et le numéro de port de la base de données Redis. Si la base de données Redis n'est pas locale, vous devez définir l'adresse IP correspondante.
使用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爬虫时,我们可以根据自己的需求选择不同的链接提取器和去重工具,从而实现更为高效和灵活的爬虫功能。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!