/ / Scrapy: Ausführen mehrerer verschachtelter Suchen gegen dieselbe URL - python, scrapy

Scrapy: mehrere verschachtelte Suchen gegen dieselbe URL ausführen - Python, Scrapy

Ich bin ziemlich neu bei Python und sehr neu bei Scrapy. Ich versuche, eine Spinne zu bauen, die zu einer gegebenen URL geht und mehrere verschachtelte Suchen innerhalb dieser Site durchführt. Wenn ich zum Beispiel einen Online-Laden suchte, würde ich mit einer Bitte an anfangen http://www.mystore.comSuchen Sie dann innerhalb von 3 Ebenen von Untermenüsdie Site für verschiedene Produkte, die zur Laufzeit über eine CSV-Eingabedatei spezifiziert werden. Auf jeder Ebene im Untermenu suche ich nach der Zielkategorie und feuere eine Anfrage ab, um diese Unterkategorie zu bekommen, bis ich zu Level 3 komme, wenn ich die Ergebnisse nach einem bestimmten Gegenstand analysiere.

  • Store-Basis-URL -> Home -> Küche -> Appliances: Ergebnisse parsen auf der Suche nach "Mixer".
  • Store-Basis-URL -> Home -> Küche -> Appliances: Ergebnisse parsen auf der Suche nach "Wasserkocher".
  • Geschäftsbasis-URL -> Home -> Elektrisch -> Video: Ergebnisse parsen Suche nach "DVD-Player".
  • Store-Basis-URL -> Startseite -> Garten -> Tools: Suchergebnisse analysieren für "strimmer".
  • Store-Basis-URL -> Kleidung -> Männer -> Hosen: Ergebnisse parsen auf der Suche nach "Denim".

Ich kann die Suchdaten in meinen CrawlSpider ladenund sagen Sie Scrapy, alle diese Suchen auszuführen, aber Scrapy sieht, dass die Start-URL dieselbe ist, so dass nur die erste Anfrage ausgeführt wird und alle anderen als Duplikate betrachtet werden.

Die Seite, die ich crawle, hat keinen RESTfulSchnittstelle, so kann ich Request-URLs nicht angeben, um direkt zur entsprechenden Unterkategorie zu gelangen. Stattdessen muss ich auf jeder Ebene durch die Navigationslinks blättern, um die nächste Unterkategorie zu finden, die ich crawlen möchte.

Ich möchte nicht den ganzen Baum vonSucht innerhalb der Spinne herum und überprüft, wo ich im Baum bin. Die Suchen funktionieren gut für eine einzelne Suche, z.B. für den "Mixer" oben, aber ich kann nicht herausfinden, wie man Scrapy überredet, alle Suchen getrennt auszuführen.

Kann jemand mich auf einige Beispiele oder andere Dokumente hinweisen, um so etwas zu tun?

Antworten:

1 für die Antwort № 1

erzählen Linkextraktor die gleichen URLs nicht zu filtern:

unique (boolean) - ist ein boolescher Wert, der angibt, ob eine doppelte Filterung auf extrahierte Links angewendet werden soll.

aber von deiner Frage scheint es, dass jederWebsite, die Sie Crawl brauchen eine separate Spinne, während alle die gleichen Pipelines etc. (klassische Scrapy-Projekt-Struktur), sollten Sie auch mit einfachen Spider und nicht CrawlSpider, beachten Sie, dass es nicht notwendig, "den gesamten Baum der Suche zu erinnern ", feuern Sie einfach so viele Anfragen wie nötig ab und lassen Sie scrapy sie in die Warteschlange stellen und rufen Sie ihren Rückruf einzeln an.


0 für die Antwort № 2

@Kerl:

Die Suchparameter stammen aus Zeilen in einer CSV-Datei, aber logisch wären sie etwa so:

  • www.mystore.com -> finden Sie "Home" -> finden Sie "Küche" -> finden Sie "Appliances" -> analysieren, um "Mixer" Elemente zu finden.
  • www.mystore.com -> finden Sie "Home" -> finden Sie "Küche" -> finden Sie "Appliances" -> analysieren, um "Wasserkocher" Elemente zu finden.
  • www.mystore.com -> finden Sie "Home" -> finden Sie "Electrical" -> finden Sie "Video" -> analysieren, um "DVD-Player" Elemente zu finden.
  • www.mystore.com -> finde "Home" -> finde "Garden" -> finde "Tools" -> parse um "strimmer" zu finden.
  • www.mystore.com -> finde "Bekleidung" -> finde "Männer" -> finde "Hosen" -> suche nach "Denim" Artikeln.
  • www.anotherstore.com -> "Home" finden -> "Kitchen" finden -> "Appliances" finden -> parse um "blender" zu finden.
  • ...etc

Die Suche ist also logisch eine Menge von verschachteltenAbfragen, aber ich würde lieber getrennte Suchen für jede Zeile oben ausführen, wenn ich Scrapy überreden kann, die Tatsache zu ignorieren, dass es mehrere Suchen gibt, die von www.mystore.com beginnen. Die Daten werden als ein Satz einfacher CSV-Datensätze gespeichert, d. H. Einer für jeden extrahierten Gegenstand. Es besteht also keine Notwendigkeit, einen Baum zu erstellen, außer dass ich nicht weiß, wie man mehrere verschiedene Suchanfragen mit derselben Basis-URL über Scrapy ausführen kann.

Hilft das?


0 für die Antwort № 3

OK, ich habe es funktioniert.

  • Eine Startanforderung ist eine Basis-URL, z. www.mystore.com
  • Parsen Sie die Antwort von der Startanfrage und führen Sie dann einfach alle Suchen aus basierend auf den Navigationslinks der obersten Ebene, die von der Basisseite extrahiert wurden.

Es ist nicht effizient, und ich muss es neu arbeiten, wenn die Datenmengen steigen, aber im Moment scheint es zu funktionieren.

Danke für deinen Rat.