1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python3のScrapyでアイテム数やページ数のカウントで停止させる

Last updated at Posted at 2018-04-12

※ Scrapyは既にインストール済みの方向けです

ScrapyのCrawlSpiderでの停止処理

CrawlSpiderでクローラーを作成した際、ウェブサイト全体をスクレイピングしていると時間がかかるため、途中で停止させたい。

標準ではDEPTH_LIMITで一定の階層まで探ると停止する設定がついている。
settings.pyでDEPTH_LIMIT=2のようにすれば最初のページで1回リンクを辿り、次の階層でもう一回リンクを辿るため、2階層辿るような設定になる。

しかし、サイトの構成やサイトマップを拾ったりフッターメニューが用意されている場合はDEPTH_LIMITを設定したとしても想定より多いページ数を拾ってくることになる可能性がある。

CloseSpiderExtention

そこでウェブサイトの構成に関わらず一定の量を取得できるように、取得するページ数やアイテム数で制御できるようにしたい。
それがClose spider extentionというものを使用すると実現できるらしい。

settings.pyのコメントにされているEXTENSIONSにCloseSpiderを追加する。
CLOSESPIDER_TIMEOUT、CLOSESPIDER_ITEMCOUNT、CLOSESPIDER_PAGECOUNT、CLOSESPIDER_ERRORCOUNTが設定できるようになる。(デフォルト値は全て0)

CONCURRENT_REQUESTの設定でダウンロードの予約が行われている。
値が大きいとその分ダウンロードの予約が行われ、停止後もしばらくダウンロードし続ける。
気になる場合は1に設定しておくとよい。
(本来の役割は設定している数値分、複数のサイトのダウンロードを同時進行させるもの。)

settings.py
CONCURRENT_REQUEST = 1

EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
    'scrapy.extensions.closespider.CloseSpider': 1,
}

CLOSESPIDER_TIMEOUT = 0
CLOSESPIDER_ITEMCOUNT = 0
CLOSESPIDER_PAGECOUNT = 0
CLOSESPIDER_ERRORCOUNT = 0

参考

https://doc.scrapy.org/en/latest/topics/extensions.html#module-scrapy.contrib.closespider
https://doc.scrapy.org/en/latest/topics/settings.html

[ 検索キーワード ]
scrapy page count limit scrapy request count limit

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?