Scrapy は優れた Python クローラー フレームワークであり、同時実行性、分散、非同期性などの高度な機能をサポートしており、開発者がインターネット上のデータをより高速かつ安定してクロールできるように支援します。 Scrapy では、リンク抽出ツールと重複排除ツールは、クローラーが自動化されたデータのキャプチャと処理を完了するのを支援する非常に重要なコンポーネントです。この記事では、Scrapy のリンク抽出ツールと重複排除ツールを分析し、それらがどのように実装されているか、そして Scrapy のクローリング プロセスでのアプリケーションについて調査します。
1. リンク エクストラクターの機能と実装
Link Extractor は、URL リンクを自動的に抽出する Scrapy クローラー フレームワークのツールです。完全なクローラー プロセスでは、多くの場合、Web ページからいくつかの URL リンクを抽出し、これらのリンクに基づいてさらにアクセスして処理する必要があります。リンク エクストラクターは、このプロセスを実装するために使用され、いくつかのルールに従って Web ページからリンクを自動的に抽出し、これらのリンクを後続の処理のために Scrapy のリクエスト キューに保存します。
Scrapy では、リンク抽出機能は正規表現または XPath 式を介して照合します。 Scrapy は、正規表現に基づく LinkExtractor と XPath 式に基づく LxmlLinkExtractor の 2 つのリンク抽出ツールを提供します。
正規表現ベースの LinkExtractor は、Web ページ内の URL に対して定期的なマッチングを実行することで、正常に一致したリンクを自動的に抽出できます。たとえば、Web ページから http://example.com/ で始まるすべてのリンクを抽出する場合は、次のコードを使用できます。
from scrapy.linkextractors import LinkExtractor link_extractor = LinkExtractor(allow=r'^http://example.com/') links = link_extractor.extract_links(response)
allowed パラメータは、すべてのリンクに一致する正規表現を指定します。 http で始まる ://example.com/ で始まるリンク。 extract_links() メソッドは、正常に一致したすべてのリンクを抽出し、それらを Link オブジェクトのリストに保存できます。
Link オブジェクトは、Scrapy フレームワークでリンクを表すために使用されるデータ構造であり、リンクの URL、タイトル、アンカー テキスト、リンク タイプなどの情報が含まれています。これらのオブジェクトを通じて、必要なリンクを簡単に取得し、Scrapy クローラーでさらに処理してアクセスすることができます。
from scrapy.linkextractors import LxmlLinkExtractor link_extractor = LxmlLinkExtractor(restrict_xpaths='//a[@class="storylink"]') links = link_extractor.extract_links(response)
# settings.py DOWNLOAD_HANDLERS = { 's3': None, }
# settings.py DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_HOST = "localhost" REDIS_PORT = 6379
使用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爬虫时,我们可以根据自己的需求选择不同的链接提取器和去重工具,从而实现更为高效和灵活的爬虫功能。
以上がScrapy のリンク抽出ツールと重複排除ツールの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。