Как создать веб-сканер на основе Scrapy, который будет работать вечно?

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

  1. Беги вечно

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

  2. Планируйте приоритеты.

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

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

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


person superb    schedule 28.02.2010    source источник


Ответы (2)


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

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

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

person msw    schedule 28.02.2010
comment
Спасибо! Насколько я понимаю, Spiders, похоже, работает для одноразовой работы (просто просканируйте все, что указано, и закройте). Вы имеете в виду, что если мне нужен долговременный поисковый робот, я должен сам написать приложение и вызвать spider для выполнения этой работы. Нелегко реализовать долговременную логику внутри Scrapy с помощью промежуточного программного обеспечения или чего-то еще, не так ли? - person superb; 28.02.2010
comment
Вы, вероятно, могли бы реализовать логику повторного паука на уровне промежуточного программного обеспечения Spider, но примитивы не кажутся подходящими для этого, и я чувствую, что вы бы опускали логику уровня приложения на уровень представления (если мне позволят злоупотреблять терминологией OSI). doc.scrapy.org/topics/spider-middleware.html - person msw; 28.02.2010
comment
Ссылка на промежуточное ПО планировщика, которую вы предоставили, сейчас не работает. - person William Kinaan; 14.03.2014

Вот некоторые подробности о требованиях к бесконечной эксплуатации.

Вам нужно поймать 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 
person z.wang    schedule 18.08.2016