ホームページ > バックエンド開発 > Python チュートリアル > Scrapy のリンク抽出ツールと重複排除ツールの分析

Scrapy のリンク抽出ツールと重複排除ツールの分析

WBOY
リリース: 2023-06-22 09:17:27
オリジナル
1691 人が閲覧しました

Scrapy は優れた Python クローラー フレームワークであり、同時実行性、分散、非同期性などの高度な機能をサポートしており、開発者がインターネット上のデータをより高速かつ安定してクロールできるように支援します。 Scrapy では、リンク抽出ツールと重複排除ツールは、クローラーが自動化されたデータのキャプチャと処理を完了するのを支援する非常に重要なコンポーネントです。この記事では、Scrapy のリンク抽出ツールと重複排除ツールを分析し、それらがどのように実装されているか、そして Scrapy のクローリング プロセスでのアプリケーションについて調査します。

1. リンク エクストラクターの機能と実装

Link Extractor は、URL リンクを自動的に抽出する Scrapy クローラー フレームワークのツールです。完全なクローラー プロセスでは、多くの場合、Web ページからいくつかの URL リンクを抽出し、これらのリンクに基づいてさらにアクセスして処理する必要があります。リンク エクストラクターは、このプロセスを実装するために使用され、いくつかのルールに従って Web ページからリンクを自動的に抽出し、これらのリンクを後続の処理のために Scrapy のリクエスト キューに保存します。

Scrapy では、リンク抽出機能は正規表現または XPath 式を介して照合します。 Scrapy は、正規表現に基づく LinkExtractor と XPath 式に基づく LxmlLinkExtractor の 2 つのリンク抽出ツールを提供します。

  1. 正規表現ベースの LinkExtractor

正規表現ベースの 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 クローラーでさらに処理してアクセスすることができます。

  1. XPath 式に基づく LxmlLinkExtractor
#XPath 式に基づく LxmlLinkExtractor は、Web ページの HTML タグの XPath 式を照合することで、成功した一致を自動的に抽出できます。たとえば、Web ページから「storylink」と等しいクラス属性を持つすべてのリンクを抽出する場合は、次のコードを使用できます。

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 重複排除機能を例として説明します。

    Redis ベースの重複排除機能
Redis は、分散、永続化、豊富なデータ構造などの高度な機能をサポートできる高性能 NoSQL インメモリ データベースです。 Scrapy の重複排除ツールの実装に適しています。 Scrapy の Redis デデュプリケーターは、アクセス済みの URL リンクをマークして、繰り返しのアクセスを避けることができます。

Scrapy は、デフォルトでメモリベースの Set クラス重複排除機能を使用します。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 パラメーターは、R​​edis データベースの 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート