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'
を追加します。
