Scrapy запустить несколько пауков из сценария - PullRequest
0 голосов
/ 26 апреля 2020

Эй, следующий вопрос:

У меня есть сценарий, с которого я хочу, чтобы пауки Scrapy начали. Для этого я использовал решение из другого поста о переполнении стека для интеграции настроек, поэтому мне не нужно перезаписывать их вручную. Поэтому до сих пор я могу запускать два сканера вне проекта Scrapy:

from scrapy_bots.update_Database.update_Database.spiders.m import M
from scrapy_bots.update_Database.update_Database.spiders.p import P
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
import os

class Scraper:
    def __init__(self):
        settings_file_path = 'scrapy_bots.update_Database.update_Database.settings' # The path seen from root, ie. from main.py
        os.environ.setdefault('SCRAPY_SETTINGS_MODULE', settings_file_path)
        self.process = CrawlerProcess(get_project_settings())
        self.spider_m = M # The spider you want to crawl
        self.spider_p = P

    def run_spiders(self):
        self.process.crawl(self.spider_m)
        self.process.crawl(self.spider_p)
        self.process.start()  # the script will block here until the crawling is finished

Получение настроек проекта scrapy, когда скрипт находится вне каталога root

Этот фрагмент кода хранится в файле рядом с файлом Scrapy.cfg. Чтобы запустить паука из другого каталога, мне просто нужно было изменить некоторые настройки в файле настроек, а затем я могу запустить паука из другого каталога, установив новый объект этого класса до сих пор так хорошо: (для лучшего объяснения смотрите по ссылке выше).

Теперь мои проблемы:

1. Мне нужно запускать двух пауков одновременно в тот момент, когда они бегут одновременно (я уже взглянул на документы по scrapy, но код не работает для меня, потому что, когда я его реализовал, он сказал, что в реакторе не работает ни одна функция.

reactor.run()
reactor.stop()

Это не удивительно, потому что реактор выглядит так, когда я смотрю на него:

# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

"""
The reactor is the Twisted event loop within Twisted, the loop which drives
applications using Twisted. The reactor provides APIs for networking,
threading, dispatching events, and more.

The default reactor depends on the platform and will be installed if this
module is imported without another reactor being explicitly installed
beforehand. Regardless of which reactor is installed, importing this module is
the correct way to get a reference to it.

New application code should prefer to pass and accept the reactor as a
parameter where it is needed, rather than relying on being able to import this
module to get a reference.  This simplifies unit testing and may make it easier
to one day support multiple reactors (as a performance enhancement), though
this is not currently possible.

@see: L{IReactorCore<twisted.internet.interfaces.IReactorCore>}
@see: L{IReactorTime<twisted.internet.interfaces.IReactorTime>}
@see: L{IReactorProcess<twisted.internet.interfaces.IReactorProcess>}
@see: L{IReactorTCP<twisted.internet.interfaces.IReactorTCP>}
@see: L{IReactorSSL<twisted.internet.interfaces.IReactorSSL>}
@see: L{IReactorUDP<twisted.internet.interfaces.IReactorUDP>}
@see: L{IReactorMulticast<twisted.internet.interfaces.IReactorMulticast>}
@see: L{IReactorUNIX<twisted.internet.interfaces.IReactorUNIX>}
@see: L{IReactorUNIXDatagram<twisted.internet.interfaces.IReactorUNIXDatagram>}
@see: L{IReactorFDSet<twisted.internet.interfaces.IReactorFDSet>}
@see: L{IReactorThreads<twisted.internet.interfaces.IReactorThreads>}
@see: L{IReactorPluggableResolver<twisted.internet.interfaces.IReactorPluggableResolver>}
"""

from __future__ import division, absolute_import

import sys
del sys.modules['twisted.internet.reactor']
from twisted.internet import default
default.install()

https://docs.scrapy.org/en/latest/topics/practices.html

Я хочу запустить эту функцию несколько раз в моем скрипте в разных точках. Я уже прочитал много постов о том, как обработать Twisted Reactor, не может быть получен повторно Ошибка, но у меня ничего не работает.

Scrapy - Reactor не перезагружается

Было бы замечательно, если бы кто-нибудь мог помочь мне с некоторыми подробными объяснениями, потому что я ничего не понимаю со всеми остальными постами.

...