Python Tech

Python Scrapy 特定のページの優先度を高くする方法

Scrapyはクローラーを効率よく実装できるPythonのフレームワークです。

Scrapyを活かせば、ゼロからスクラッチでコーディングすることなく、クローリング、スクレイピングをするロボット、スパイダーを簡単に開発できます。

とはいえ最初は、独特の仕様を理解するのに時間がかかるのも事実です。

今回はスパイダーのページ処理の優先度を変更する方法を解説しています。

 

結論

Requestオブジェクトのpriorityを変更する関数を用意

def apply_priority(priority: int):
    def p_req(request, _):
        return request.replace(priority=priority)
    return p_req

 

CrawlSpiderでの実装例
処理を優先するページは渡す数値(下記だと10)を大きくします。

Rule(
    LinkExtractor(allow=r'/hoge/fuga/.+\.html'),
    process_request=apply_priority(10),
    callback='_parse_item',
),

 

実行環境

# python --version
Python 3.9.6

# pip freeze | grep Scrapy
Scrapy==2.5.0

 

スパイダーで特定のページの優先度を高くする方法

scrapy.Spiderや汎用スパイダー(CrawlSpider)などで、特定のページの処理の優先度を高く設定し、他のページよりも早期に処理するにはどうしたらいいでしょうか?

一番かんたんなのは Request オブジェクトのpriorityの数値を大きく変更する方法。

Requestオブジェクトのpriorityを置き換える関数を適当に用意します。

def apply_priority(priority: int):
    """優先度を設定
    """
    def process_request(request, response):
        return request.replace(priority=priority)
    return process_request

 

上記例だと apply_priority() はRequestオブジェクトを操作する関数を返す関数です。

この呼び出し可能オブジェクト(callable)は、最初の引数としてリクエストを受け取り、2番目の引数としてリクエストの発信元である Response を受け取る必要があります。 Request オブジェクト、または None を返す必要があります(リクエストを除外するため)。

この関数をRuleで渡します。

以下はCrawlSpiderでRuleを設定する場合のサンプルです。

process_requestにはRequestオブジェクトを操作する(今回は優先度を変更する)呼び出し可能オブジェクトを指定します。今回はここに上記のapply_priority()を渡します。

rules = (
    Rule(
       LinkExtractor(allow=r"/archive/hoga/.+$"),
       process_request=apply_priority(10),
       callback='_parse_item',
    ),
)

 

あるRuleの優先度を高くするときはapply_priority()に渡す数値を大きくすればOKです。

 

今回参考にしたページ・資料

CrawlSpider スパイダー — Scrapy 1.7.3 ドキュメント

  • この記事を書いた人

次世代ペンギン

長いのでペンギンとお呼びください。システム開発・プログラミングのお仕事をしています。甘味とコーヒーは生命線。多くの人に役立つ情報のシェアが目標です。

人気の記事

1

会社員でプログラマーとして働いている人、インフラやネットワークのエンジニアとして働いている人の中には、フリーランスのプログラマーとして独立、もしくは転向したい人もいるので ...

2

キャリアアップのため、または高収入を目指して、しっかりプログラミングを学びたいという人が増えてきましたね。 この記事では現役のエンジニアである私が、実際に仕事で稼げるよう ...

3

フリーランスのプログラマーにとって収入の向上に最も直結するのはスキルです。 必要なスキル、スキルの獲得方法が気になる人も多いでしょう。 また、これからフリーランスを目指す ...

4

Vuetifyの v-progress-circular コンポーネントは、数値データや処理状況を環状(円状)のデザインで教えてくれるUIデザインです。 ローディングのス ...

5

Vuexのstore(ストア)を使うと、各コンポーネント間で個別にデータのやり取りすることなく、データを一元的に管理できます。Vueでは欠かせない機能といえるでしょう。 ...

-Python, Tech
-, , ,

© 2021 ペンギンのーと