過去の日記

2017-02-10 [長年日記]

scrapy で取得順をランダムにしたい [Python]

うーん。これがデフォルトで搭載されていないのだろうか。

まぁ、その辺の自由度どうにかならない? というissueはありましたけど。

https://github.com/scrapy/scrapy/issues/2435


完全にランダムでよければ、キューがメモリに収まっている範囲に限定ですが、こんな感じでできました。

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'

を追加します。