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です。