Как создать веб-сканер на основе Scrapy, чтобы он работал вечно? - PullRequest
11 голосов
/ 28 февраля 2010

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

  1. Беги навсегда

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

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

    Дайте разные приоритеты разным типам URL.

  3. Многопоточное извлечение

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

Ответы [ 2 ]

12 голосов
/ 28 февраля 2010

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

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

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

0 голосов
/ 18 августа 2016

О требованиях для работы навсегда, вот некоторые подробности.

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

См. Коды удара:

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 
...