L'API deve consentire richieste di ottenere HTTP arbitrarie contenenti URL che l'utente desidera eliminare, quindi Flask deve restituire i risultati di scrap.Creazione di un'API di pallone RESTful per Scrapy
Il seguente codice funziona per la prima richiesta http, ma dopo l'interruzione del reattore torto, non si riavvia. Potrei anche non andare su questo nel modo giusto, ma voglio solo mettere una API scrapy RESTful su Heroku, e quello che ho finora è tutto ciò che riesco a pensare.
C'è un modo migliore per progettare questa soluzione? O come posso consentire a scrape_it
di tornare senza fermare il reattore a spirale (che non può essere riavviato)?
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))
Potrebbe fornire un errore di traceback o qualcosa del genere? Anche perché non basta rimuovere questa riga 'd.addBoth (lambda _: reactor.stop())' e chiamare reactor.stop dopo 'reactor.run()' Sto assumendo che errori fuori perché quando entra nel reattore di funzione potrebbe essere in uno stato avviato o uno stato di arresto. Non è garantito – AdriVelaz
perché vuoi usare Scrapy? Esistono altri modi per eliminare le pagine – ahmed
@ahmed il mio problema è la creazione di una coda asynch per l'estrazione di molte pagine e il successivo spidering verso i link su quelle pagine. Cosa consiglieresti per questo? –