[爬虫類]の研究ノートのday56 6.6公式文書のソースコード解析をscrapyは、Redisの:.スケジューラを参照してください。

。スケジューラ:6.6公式ドキュメント・ソース解析リファレンスscrapyは、Redisの

ここに画像を挿入説明
scheduler.py
この拡張はscrapyする代わりに、スケジューラが付属しています(スケジューラは、変数の設定に示されている)、この拡張機能は、分散スケジューリングの使用クローラを達成しています。キュー・データ構造からのデータ構造を利用することで実装されています。

分散scrapy-Redisの二種類が達成さ:項目爬虫類及び分散処理は、分散スケジューラ・モジュールとモジュールパイプラインによって実現されます。両方の補助モジュールの上記他の機能モジュールとして

輸入のimportlibの
インポート6

scrapy.utils.misc輸入load_objectから

から。インポート接続

TODO:SCRAPY_JOBのサポートを追加します。

クラススケジューラ(オブジェクト):
「」「のRedisベースのスケジューラ」「」

def __init__(self, server,
             persist=False,
             flush_on_start=False,
             queue_key='%(spider)s:requests',
             queue_cls='scrapy_redis.queue.SpiderPriorityQueue',
             dupefilter_key='%(spider)s:dupefilter',
             dupefilter_cls='scrapy_redis.dupefilter.RFPDupeFilter',
             idle_before_close=0,
             serializer=None):
    """Initialize scheduler.
    Parameters
    ----------
    server : Redis
        The redis server instance.
    persist : bool
        Whether to flush requests when closing. Default is False.
    flush_on_start : bool
        Whether to flush requests on start. Default is False.
    queue_key : str
        Requests queue key.
    queue_cls : str
        Importable path to the queue class.
    dupefilter_key : str
        Duplicates filter key.
    dupefilter_cls : str
        Importable path to the dupefilter class.
    idle_before_close : int
        Timeout before giving up.
    """
    if idle_before_close < 0:
        raise TypeError("idle_before_close cannot be negative")

    self.server = server
    self.persist = persist
    self.flush_on_start = flush_on_start
    self.queue_key = queue_key
    self.queue_cls = queue_cls
    self.dupefilter_cls = dupefilter_cls
    self.dupefilter_key = dupefilter_key
    self.idle_before_close = idle_before_close
    self.serializer = serializer
    self.stats = None

def __len__(self):
    return len(self.queue)

@classmethod
def from_settings(cls, settings):
    kwargs = {
        'persist': settings.getbool('SCHEDULER_PERSIST'),
        'flush_on_start': settings.getbool('SCHEDULER_FLUSH_ON_START'),
        'idle_before_close': settings.getint('SCHEDULER_IDLE_BEFORE_CLOSE'),
    }

    # If these values are missing, it means we want to use the defaults.
    optional = {
        # TODO: Use custom prefixes for this settings to note that are
        # specific to scrapy-redis.
        'queue_key': 'SCHEDULER_QUEUE_KEY',
        'queue_cls': 'SCHEDULER_QUEUE_CLASS',
        'dupefilter_key': 'SCHEDULER_DUPEFILTER_KEY',
        # We use the default setting name to keep compatibility.
        'dupefilter_cls': 'DUPEFILTER_CLASS',
        'serializer': 'SCHEDULER_SERIALIZER',
    }
    for name, setting_name in optional.items():
        val = settings.get(setting_name)
        if val:
            kwargs[name] = val

    # Support serializer as a path to a module.
    if isinstance(kwargs.get('serializer'), six.string_types):
        kwargs['serializer'] = importlib.import_module(kwargs['serializer'])

    server = connection.from_settings(settings)
    # Ensure the connection is working.
    server.ping()

    return cls(server=server, **kwargs)

@classmethod
def from_crawler(cls, crawler):
    instance = cls.from_settings(crawler.settings)
    # FIXME: for now, stats are only supported from this constructor
    instance.stats = crawler.stats
    return instance

def open(self, spider):
    self.spider = spider

    try:
        self.queue = load_object(self.queue_cls)(
            server=self.server,
            spider=spider,
            key=self.queue_key % {'spider': spider.name},
            serializer=self.serializer,
        )
    except TypeError as e:
        raise ValueError("Failed to instantiate queue class '%s': %s",
                         self.queue_cls, e)

    try:
        self.df = load_object(self.dupefilter_cls)(
            server=self.server,
            key=self.dupefilter_key % {'spider': spider.name},
            debug=spider.settings.getbool('DUPEFILTER_DEBUG'),
        )
    except TypeError as e:
        raise ValueError("Failed to instantiate dupefilter class '%s': %s",
                         self.dupefilter_cls, e)

    if self.flush_on_start:
        self.flush()
    # notice if there are requests already in the queue to resume the crawl
    if len(self.queue):
        spider.log("Resuming crawl (%d requests scheduled)" % len(self.queue))

def close(self, reason):
    if not self.persist:
        self.flush()

def flush(self):
    self.df.clear()
    self.queue.clear()

def enqueue_request(self, request):
    if not request.dont_filter and self.df.request_seen(request):
        self.df.log(request, self.spider)
        return False
    if self.stats:
        self.stats.inc_value('scheduler/enqueued/redis', spider=self.spider)
    self.queue.push(request)
    return True

def next_request(self):
    block_pop_timeout = self.idle_before_close
    request = self.queue.pop(block_pop_timeout)
    if request and self.stats:
        self.stats.inc_value('scheduler/dequeued/redis', spider=self.spider)
    return request

def has_pending_requests(self):
    return len(self) > 0

このドキュメントではなくscrapy.core.scheduler元スケジューラを使用スケジューラクラスを上書きします。実際には、主に様々な爬虫類の間で統一されたスケジューリングを実現するために、データ記憶媒体として使用するのRedis、何の論理元スケジューラ大きな変化はありません。REQUEST要求スケジューラは、クモの名前は、一般的にプラスまたはdupefiltersキューである(dupefiltersキーを使用する場合、初期化スケジューラ、それぞれのクモをスケジュールする責任がある、と(一般的にデフォルトでは上側)dupefilters設定ファイルによって種類キューを読み、キュー構成したがって、同じクモの異なるインスタンスに対して、それが)同じデータ・ブロックを使用します。要求がスケジュールされるたびに、enqueue_requestを容器キュー(FIFOに追加され、スケジューラが重複していない場合は、URLを繰り返すかどうかを決定するdupefiltersを使用して、起動され、最後のアウトや優先順位はですることができ構成設定)。スケジューリングが完了すると、next_requestは、それがスケジューラキューコンテナインタフェースを介して、要求を削除し、起動され、彼はクモが作業をクロールそうすることを、対応するクモを送信します。

公開された291元の記事 ウォン称賛94 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_35456045/article/details/104111446