ホームページ >バックエンド開発 >Python チュートリアル >Scrapy のリンク抽出ツールと重複排除ツールの分析
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)restrict_xpaths パラメーターは、すべてのクラス属性が等しいと一致する XPath 式を指定します。 「ストーリーリンク」にタグを付けます。 LxmlLinkExtractor は LinkExtractor と同様に使用され、抽出されたリンクを Link オブジェクトのリストに保存できます。 LxmlLinkExtractor は HTML 解析に lxml ライブラリを使用するため、次のコードをプロジェクト構成ファイルに追加する必要があることに注意してください:
# settings.py DOWNLOAD_HANDLERS = { 's3': None, }上記のコードにより、Scrapy のデフォルトのダウンローダーを無効にして lxml ライブラリを使用できます。 . HTML パーサー。 2. 重複排除ツールの役割と実装Web をクロールする場合、ほとんどの場合、同じ Web ページへの異なるリンクが繰り返し表示されるため、リンクの重複排除は非常に重要です。重複が削除されない場合、クロールの問題が繰り返し発生し、帯域幅と時間が無駄になります。そのため、Scrapy では重複フィルターが導入され、クロールされたリンクをマークして判断し、繰り返しの訪問を避けるようになりました。 重複排除ツールの原理は、訪問した URL リンクをデータ構造に保存し、新しい URL リンクが訪問されたかどうかを判断し、訪問された場合はその URL リンクを破棄します。クローラーのリクエストキューに追加します。 Scrapy には、メモリベースの Set 重複排除、ディスクベースの SQLite3 重複排除、Redis ベースの重複排除など、多くの重複排除ツールが組み込まれています。重複排除機能が異なれば、適用可能なシナリオも異なります。Redis 重複排除機能を例として説明します。
# settings.py DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_HOST = "localhost" REDIS_PORT = 6379その中で、 DUPEFILTER_CLASS パラメーター 重複排除ツールによって使用される重複排除戦略を指定します。ここでは、Redis の設定されたデータ構造に基づいて実装されるscrapy_redis.dupefilter.RFPDupeFilterを使用します。 SCHEDULER パラメータは、スケジューラによって使用されるスケジューリング戦略を指定します。ここでは、Redis のソート セット データ構造に基づいて実装されるscrapy_redis.scheduler.Scheduler を使用します。 SCHEDULER_PERSIST パラメーターは、スケジューラーを Redis に永続化する必要があるかどうか、つまり、すでにクロールされた URL の再クロールを避けるために最後のクロールの状態を保存する必要があるかどうかを指定します。 REDIS_HOST パラメーターと REDIS_PORT パラメーターは、Redis データベースの IP アドレスとポート番号をそれぞれ指定します。Redis データベースがローカルでない場合は、対応する IP アドレスを設定する必要があります。
使用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 サイトの他の関連記事を参照してください。