Interfejs API powinien umożliwiać arbitralne otrzymywanie żądań HTTP zawierających adresy URL, które użytkownik chce zeskrobać, a następnie Flask powinien zwrócić wyniki skasowania.Budowanie API RESTful Flask dla Scrapy
Poniższy kod działa na pierwsze żądanie HTTP, ale po zatrzymaniu twisted reaktor, nie zostanie ponownie uruchomiony. Być może nie podchodzę do tego w odpowiedni sposób, ale chcę po prostu wstawić na Heroku interfejs RESTful scrapy API i wszystko, co do tej pory udało mi się wymyślić, jest wszystkim, co mogę wymyślić.
Czy istnieje lepszy sposób na zaprojektowanie tego rozwiązania? Albo w jaki sposób mogę pozwolić, aby scrape_it
powrócił bez zatrzymywania skręconego reaktora (którego nie można ponownie uruchomić)?
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))
Czy możesz podać błąd śledzenia lub cokolwiek? Dlaczego nie wystarczy usunąć wiersz 'd.addBoth (lambda _: reactor.stop())' i wywołać reactor.stop po 'reactor.run()' Zakładam, że to błąd, ponieważ po wejściu do Reaktor funkcyjny może być w stanie początkowym lub zatrzymanym. To nie jest gwarantowane. – AdriVelaz
dlaczego chcesz używać Scrapy? tam inne sposoby na zbieranie stron – ahmed
@ahmed Mój problem polega na budowaniu kolejki asynch do przeciągania wielu stron, a następnie spidering do odnośników na tych stronach. Co byś za to polecił? –