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のスキルを使って毎月の収入源を増やすのが最適なんじゃないかという件

実際、今のスキルに合わせて仕事を獲得し、スキマ時間で毎月+5、+20、+70万円くらいの人が多いです。

必要なスキル、仕事の獲得までの流れは以下の記事で徹底解説しています。
もちろん全部無料です
空いた時間にぜひ参考にしてみてください。

 

実行環境

# 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
-, , ,