Python Scrapy ReactorNotRestartable()

Я пытаюсь использовать Scrapy в облаке IBM как функцию. Мой __main__.py выглядит следующим образом:

class AutoscoutListSpider(scrapy.Spider):
    name = "vehicles list"

    def __init__(self, params, *args, **kwargs):
        super(AutoscoutListSpider, self).__init__(*args, **kwargs)
        make = params.get("make", None)
        model = params.get("model", None)
        mileage = params.get("mileage", None)

        init_url = "https://www.autoscout24.be/nl/resultaten?sort=standard&desc=0&ustate=N%2CU&size=20&page=1&cy=B&mmvmd0={0}&mmvmk0={1}&kmto={2}&atype=C&".format(
            model, make, mileage)
        self.start_urls = [init_url]

    def parse(self, response):
        # Get total result on list load
        init_total_results = int(response.css('.cl-filters-summary-counter::text').extract_first().replace('.', ''))
        if init_total_results > 400:
            yield {"message": "There are MORE then 400 results"}
        else:
            yield {"message": "There are LESS then 400 results"}


def main(params):
    process = CrawlerProcess()
    try:
        runner = crawler.CrawlerRunner()
        runner.crawl(AutoscoutListSpider, params)
        d = runner.join()
        d.addBoth(lambda _: reactor.stop())
        reactor.run()
        return {"Success ": main_result}
    except Exception as e:
        return {"Error ": e, "params ": params}

Я загружаю его в качестве функции IBM, это нормально.

Но проблема в том, что когда я запускаю его, в python console или когда я invoke IBM function, он выполняется в первый раз, но если я хочу выполнить его во второй раз, я получаю сообщение об ошибке:

{'Error ': ReactorNotRestartable(), 'params ': {'make': '9', 'model': '1624', 'mileage': '2500'}}

Вызывается так:

IBM:

ibmcloud wsk action invoke --result ascrawler --param make 9 --param model 1624 --param mileage 2500

Консоль Python:

main({"make":"9", "model":"1624", "mileage":"2500"})

В следующем коде я попытался добавить возможность запускать его несколько раз, но безуспешно.

runner = crawler.CrawlerRunner()
runner.crawl(AutoscoutListSpider, params)
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.run()

Есть идеи, как это решить?


person Boky    schedule 05.07.2018    source источник
comment
Это больше похоже на лямбду? Если это так, это может не означать каждый раз новый перезапуск. Вы должны попробовать запрос через некоторое время и посмотреть, сработает ли он тогда?   -  person Tarun Lalwani    schedule 05.07.2018
comment
Как вы его вызываете? Как долго это работает?   -  person data_henrik    schedule 05.07.2018
comment
@data_henrik Из python console я вызываю его следующим образом: main({"make":"9", "model":"1624", "mileage":"2500"}). И как IBM action : ibmcloud wsk action invoke --result ascrawler --param make 9 --param model 1624 --param mileage 2500 . Но ничего страшного, иначе не запустилось бы с первого раза.   -  person Boky    schedule 05.07.2018


Ответы (1)


Вы хотели использовать CrawlerRunner, а не CrawlerProcess?

Согласно документации, вместо CrawlerProcess следует использовать CrawlerRunner, "если ваше приложение уже использует Twisted и вы хотите запустить Scrapy в том же реакторе". Это не относится к действиям Python в IBM Cloud. Функции.

Изменив метод main на следующий код, он работает правильно.

def main(params):
    process = CrawlerProcess()
    try:
        process.crawl(AutoscoutListSpider, params)
        process.start()
        return {"Success ": params}
    except Exception as e:
        return {"Error ": e, "params ": params}
person James Thomas    schedule 10.07.2018
comment
Это дает ошибку ReactorNotRestartable. См. соответствующий вопрос: stackoverflow.com/questions/61083449/ - person JohnAndrews; 09.04.2020