2017-01-06 14 views
0

Ich fange gerade erst mit Scrapy an und habe das Tutorial durchgearbeitet, aber ich stoße auf ein Problem, das ich weder im Tutorial noch in der Dokumentation finden kann, oder ich habe die Antwort gelesen mehrere Male jetzt, aber ich bin zu verstehen einfach nicht richtig ...Scrapy - URLs dynamisch basierend auf HTTP-Statuscode erstellen?

Szenario:

Lassen Sie uns sagen, ich habe genau 1 Website, die ich kriechen möchte. Der Inhalt wird dynamisch basierend auf in URL übergebenen Abfrageparametern gerendert. Ich werde für 3 "Sätze" von Daten auf URL Pram von "Kategorie" kratzen müssen.

Alle Informationen Ich brauche aus gemeinsamen Basis-URLs wie diese ergriffen werden:

"http://shop.somesite.com/browse/?product_type=instruments"

Und die URLs für jede Kategorie wie folgt:

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums"

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=keyboards"

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=guitars"

Der einzige Vorbehalt hier ist, dass die Website nur 30 Ergebnisse pro erste Anfrage lädt. Möchte der Benutzer mehr sehen, muss er unten auf den Button "Weitere Ergebnisse laden ..." klicken. Nachdem wir dies ein wenig untersucht haben, wird beim ersten Laden der Seite nur die Anfrage für die Top 30 gemacht (was sinnvoll ist) und nach dem Klicken auf die Schaltfläche "Mehr laden" wird die URL mit einem angehängten "Seitex = 2" aktualisiert und der Container wird mit 30 weiteren Ergebnissen aktualisiert. Danach verschwindet die Schaltfläche und wenn der Benutzer die Seite weiter scrollt, werden nachfolgende Anforderungen an den Server gestellt, um die nächsten 30 Ergebnisse zu erhalten, "pagex" -Wert wird um eins inkrementiert, Container wird mit Ergebnissen aktualisiert, spülen und wiederholen.

Ich bin mir nicht sicher, wie die Seitennummerierung auf Websites gehandhabt wird, aber die einfachste Lösung, die ich gefunden habe, ist einfach die maximale Anzahl "pagex" für jede Kategorie herauszufinden und die URLs auf diese Zahl zu setzen .

Zum Beispiel, wenn Sie URL in Browser passieren:

"http://shop.somesite.com/browse/?q=&product_type=instruments&category=drums&pagex=22"

HTTP Response Code 200 empfangen wird und alle Ergebnisse werden gerendert Seite. Groß! Das gibt mir, was ich brauche!

Aber, sagen nächste Woche oder so, 50 weitere Elemente hinzugefügt, so dass jetzt die max ist "... pagex = 24" Ich würde nicht immer die neuesten.

Oder 50 Elemente entfernt und neue max ist "... pagex = 20", ich werde 404 Antwort erhalten, wenn Sie "22" anfordern.

Ich möchte eine Testantwort mit der letzten bekannten "guten" max-Seitenzahl senden und basierend auf der HTTP-Antwort, die verwendet wird, um zu entscheiden, welche URL sein wird.

Bevor ich mit dem Crawlen beginne, möchte ich 1 zu "pagex" hinzufügen und auf 404 prüfen. Wenn 404 ich weiß, bin ich immer noch gut, wenn ich 200 bekomme, muss ich 1 bis ich hinzufügen Get 404, also weiß ich, wo Max ist (oder verringern, falls erforderlich).

Ich kann nicht herausfinden, ob ich dies mit Scrapy tun kann, muss ich ein anderes Modul verwenden, um diese Prüfung zuerst auszuführen. Ich habe versucht, einfache Tests zu Testzwecken in den Methoden "parse" und "start_requests" hinzuzufügen, und kein Glück.start_requests scheint nicht in der Lage zu sein, Antworten zu verarbeiten, und parse kann den Antwortcode überprüfen, aktualisiert die URL jedoch nicht wie angewiesen.

Ich bin sicher, dass es meine schlechte Programmierkenntnisse (auf diese alle noch neu), aber ich kann nicht sehr eine tragfähige Lösung ....

Irgendwelche Gedanken oder Ideen zu finden scheinen, sind sehr willkommen!

Antwort

0

können Sie in scrapy konfigurieren, welche Status zu konfigurieren, auf diese Weise können Sie Entscheidungen zum Beispiel in der parse Methode nach der response.status treffen. Überprüfen Sie, wie die Status in the documentation behandelt werden. Beispiel:

class MySpider(CrawlSpider): 
    handle_httpstatus_list = [404] 
+0

Vielen Dank für die Antwort und Entschuldigung für die Verzögerung! Ich habe mein kleines Experimentieren im Crawlen der Website verschoben, um an anderen Projekten zu arbeiten. Ich werde Ihren Vorschlag heute Abend hier testen und dies als die Antwort markieren, wenn es tatsächlich funktioniert. Ich bin gespannt, ob Sie Ihre Gedanken zu meiner "Strategie" insgesamt vorstellen können. In Anbetracht dessen, was ich zu tun beabsichtige, und der spezifischen Herausforderung, würden Sie das als akzeptablen Weg sehen, dieses Problem zu lösen, oder würden Sie einen anderen Ansatz vorschlagen? –

Verwandte Themen