Реактор Python ScrapyNotRestartable () - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь использовать 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()

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

1 Ответ

0 голосов
/ 10 июля 2018

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

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

Если изменить метод 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}
...