Создание RESTful Flask API для Scrapy

API должен разрешать произвольные HTTP-запросы на получение, содержащие URL-адреса, которые пользователь хочет удалить, а затем Flask должен вернуть результаты очистки.

Следующий код работает для первого http-запроса, но после остановки витого реактора он не будет перезапущен. Возможно, я даже не собираюсь идти по этому пути правильно, но я просто хочу установить API-интерфейс RESTful scrapy на Heroku, и все, что у меня есть, - это все, что я могу придумать.

Есть ли лучший способ для разработки этого решения? Или как я могу позволитьscrape_it вернуться без остановки витого реактора (который не может быть запущен снова)?

from flask import Flask
import os
import sys
import json

from n_grams.spiders.n_gram_spider import NGramsSpider

# scrapy api
from twisted.internet import reactor
import scrapy
from scrapy.crawler import CrawlerRunner
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals

app = Flask(__name__)


def scrape_it(url):
    items = []
    def add_item(item):
        items.append(item)

    runner = CrawlerRunner()

    d = runner.crawl(NGramsSpider, [url])
    d.addBoth(lambda _: reactor.stop()) # <<< TROUBLES HERE ???

    dispatcher.connect(add_item, signal=signals.item_passed)

    reactor.run(installSignalHandlers=0) # the script will block here until the crawling is finished


    return items

@app.route('/scrape/<path:url>')
def scrape(url):

    ret = scrape_it(url)

    return json.dumps(ret, ensure_ascii=False, encoding='utf8')


if __name__ == '__main__':
    PORT = os.environ['PORT'] if 'PORT' in os.environ else 8080

    app.run(debug=True, host='0.0.0.0', port=int(PORT))

Ответы на вопрос(1)

Ваш ответ на вопрос