Die API sollte beliebige HTTP-Get-Anfragen mit URLs erlauben, die der Benutzer abgekratzt haben möchte, und dann sollte Flask die Ergebnisse des Scraps zurückgeben.Erstellen einer RESTful Flask-API für Scrapy
Der folgende Code funktioniert für die erste http-Anforderung, aber nach dem verdrehten Reaktor stoppt er nicht neu. Ich mag vielleicht nicht einmal den richtigen Weg gehen, aber ich möchte einfach eine RESTful scrapy API auf Heroku setzen, und was ich bisher habe, ist alles was ich mir vorstellen kann.
Gibt es eine bessere Möglichkeit, diese Lösung zu erstellen? Oder wie kann ich scrape_it
erlauben, zurückzukehren, ohne gedrehte Drossel zu stoppen (die nicht wieder gestartet werden kann)?
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))
Können Sie einen Trace-Back-Fehler oder etwas anderes angeben? Auch warum nicht einfach entfernen Sie diese Zeile 'd.addBoth (Lambda _: reactor.stop())' und rufen Sie reactor.stop nach 'reactor.run()' Ich gehe davon aus, dass es aus Fehler, weil, wenn es eintritt Funktionsreaktor könnte in einem gestarteten Zustand oder einem gestoppten Zustand sein. Es ist nicht garantiert. – AdriVelaz
Warum möchten Sie Scrapy verwenden? es gibt andere Möglichkeiten, Seiten zu verschrotten – ahmed
@ahmed mein Problem baut eine asynch-Warteschlange für das Ziehen vieler Seiten, und spidering dann heraus zu den Verbindungen auf diesen Seiten. Was würdest du dafür empfehlen? –