Ich versuche, ein benutzerdefiniertes Argument an die Spinne eines Scrapys zu übergeben. Kann jemand vorschlagen, wie das geht?
Ich habe -a
irgendwo über einen Parameter gelesen , habe aber keine Ahnung, wie ich ihn verwenden soll.
quelle
Ich versuche, ein benutzerdefiniertes Argument an die Spinne eines Scrapys zu übergeben. Kann jemand vorschlagen, wie das geht?
Ich habe -a
irgendwo über einen Parameter gelesen , habe aber keine Ahnung, wie ich ihn verwenden soll.
Spider-Argumente werden im crawl
Befehl mit der -a
Option übergeben. Beispielsweise:
scrapy crawl myspider -a category=electronics -a domain=system
Spinnen können auf Argumente als Attribute zugreifen:
class MySpider(scrapy.Spider):
name = 'myspider'
def __init__(self, category='', **kwargs):
self.start_urls = [f'http://www.example.com/{category}'] # py36
super().__init__(**kwargs) # python3
def parse(self, response)
self.log(self.domain) # system
Entnommen aus dem Scrapy-Dokument: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments
Update 2013 : Zweites Argument hinzufügen
Update 2015 : Wortlaut anpassen
Update 2016 : Verwenden Sie eine neuere Basisklasse und fügen Sie super hinzu, danke @Birla
Update 2017 : Verwenden Sie Python3 super
# previously
super(MySpider, self).__init__(**kwargs) # python2
Update 2018 : Wie @eLRuLL hervorhebt, können Spinnen als Attribute auf Argumente zugreifen
self.domain
, kann ich außerhalb der__init__
Methode immer noch nicht darauf zugreifen . Python gibt einen nicht definierten Fehler aus. Übrigens, warum haben Sie densuper
Anruf weggelassen ? PS. Ich arbeite mit der CrawlSpider-Klasse__init__
ist eine Methode der Spinnenklasse. Die Implementierung selbst macht die Spinne nicht weniger robust und ist in der Antwort enthalten, um zu zeigen, dass Sie Standardwerte für Schlüsselwortargumente deklarieren können, aber wie Sie sagten, ist dies optional. Wie wir letztes Jahr betont haben, müssen Sie nichtgetattr
auf Argumente als Attribute zugreifen, z. B.self.category
oder wie wir in der Antwort sehenself.domain
Frühere Antworten waren korrekt, aber Sie müssen den Konstruktor (
__init__
) nicht jedes Mal deklarieren, wenn Sie die Spinne eines Scrapys codieren möchten. Sie können die Parameter einfach wie zuvor angeben:und in Ihrem Spinnencode können Sie sie einfach als Spinnenargumente verwenden:
Und es funktioniert einfach.
quelle
Argumente mit dem Befehl crawl übergeben
Um Argumente zu übergeben, die auf Scrapyd ausgeführt werden sollen, ersetzen Sie -a durch -d
Die Spinne erhält Argumente in ihrem Konstruktor.
Scrapy fügt alle Argumente als Spider-Attribute ein und Sie können die init- Methode vollständig überspringen . Beachten Sie , dass Sie die getattr- Methode verwenden, um diese Attribute abzurufen , damit Ihr Code nicht beschädigt wird.
quelle
Spider-Argumente werden übergeben, während der Crawl-Befehl mit der Option -a ausgeführt wird. Wenn ich zum Beispiel einen Domainnamen als Argument an meine Spinne übergeben möchte, werde ich dies tun:
Und erhalten Sie Argumente in Spinnenkonstruktoren:
...
es wird klappen :)
quelle
Alternativ können wir ScrapyD verwenden, das eine API verfügbar macht , in der wir den Namen start_url und spider übergeben können. ScrapyD hat APIs zum Stoppen / Starten / Statusieren / Auflisten der Spinnen.
scrapyd-deploy
wird die Spinne in Form eines Eies in den Dämon einsetzen und sogar die Version der Spinne beibehalten. Beim Starten der Spinne können Sie angeben, welche Version der Spinne verwendet werden soll.curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"
Ein zusätzlicher Vorteil ist, dass Sie Ihre eigene Benutzeroberfläche erstellen können, um die URL und andere Parameter vom Benutzer zu akzeptieren und eine Aufgabe mithilfe der oben genannten Scrapyd-Zeitplan-API zu planen
Weitere Informationen finden Sie in der Scrapyd-API-Dokumentation
quelle