Создание 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))