Подтвердить что ты не робот

Как создать веб-искатель на основе Scrapy для работы навсегда?

Я хочу создать веб-искатель, основанный на Scrapy, чтобы захватывать новости с нескольких сайтов новостного портала. Я хочу, чтобы этот искатель был:

  • Выполнить навсегда

    означает, что периодические повторные посещения некоторых страниц портала будут получать обновления.

  • Расписание приоритетов.

    Дайте разные приоритеты для разных типов URL-адресов.

  • Многопоточная выборка

Я прочитал документ Scrapy, но не нашел чего-то связанного с тем, что я перечислил (возможно, я недостаточно осторожен). Кто-нибудь знает, как это сделать? или просто дать некоторую идею/пример об этом. Спасибо!

4b9b3361

Ответ 1

Scrapy - это основа для пауков веб-сайтов, поэтому она предназначена для поддержки ваших критериев, но она не собирается танцевать за вас из коробки; вам, вероятно, придется ознакомиться с модулем для некоторых задач.

  • Запуск навсегда зависит от вашего приложения, которое вызывает Scrapy. Вы говорите пауки, куда идти и когда туда идти.
  • Приоритеты - это работа промежуточного программного обеспечения планировщика, которую вы должны создать и подключить к Scrapy. Документация по этому поводу выглядит пятнистой, и я не смотрел код - в принципе функция там.
  • Scrapy по своей сути принципиально асинхронный, который вполне может быть тем, что вы желаете: запрос B может быть удовлетворен, пока запрос A по-прежнему неактивен. Основополагающий механизм подключения не мешает вам выполнять многопоточную многопоточность, но Scrapy не предоставляет услуги потоковой передачи.

Scrapy - это библиотека, а не приложение. Существует нетривиальная сумма работы (кода), которую должен выполнить пользователь модуля.

Ответ 2

О требовании на run-forever, здесь некоторые подробности.

Вам нужно поймать сигнал signals.spider_idle, и в вашем методе, который подключенного к сигналу, вам нужно поднять исключение DontCloseSpider. Сигнал spider_idle отправляется в механизм scrapy, когда нет ожидающих запросов, и по умолчанию паук будет отключен. Вы можете перехватить этот процесс.

Смотрите коды удара:

import scrapy
from scrapy.exceptions import DontCloseSpider
from scrapy.xlib.pydispatch import dispatcher

class FooSpider(scrapy.Spider):
    def __init__(self, *args, **kwargs):
        super(FooSpider, self).__init__(*args, **kwargs)
        dispatcher.connect(self.spider_idle, signals.spider_idle)

    def spider_idle(self):
        #you can revisit your portal urls in this method
        raise DontCloseSpider