2017-02-10 [長年日記]
■scrapy で取得順をランダムにしたい
うーん。これがデフォルトで搭載されていないのだろうか。
まぁ、その辺の自由度どうにかならない? というissueはありましたけど。
完全にランダムでよければ、キューがメモリに収まっている範囲に限定ですが、こんな感じでできました。
import random import collections from scrapy.squeues import FifoMemoryQueue class RandomizedMemoryQueue(FifoMemoryQueue): def __init__(self): super().__init__() assert isinstance(self.q, collections.deque) def pop(self): q = self.q if q: q.rotate(random.randint(0, len(q) - 1)) return q.pop() if q else None
myproject/my_queue.py とかいう名前で保存します。(myproject が scrapyプロジェクト名として)
で、setting.py とか、設定に、
SCHEDULER_MEMORY_QUEUE = 'myproject.my_queue.RandomizedMemoryQueue'
を追加します。