Wie Sie kratzen Sie alle Inhalte von jedem link mit scrapy?
Ich bin neu mit scrapy ich möchte alle extrahieren Sie den Inhalt jedes werben von dieser website. Also ich habe Folgendes versucht:
from scrapy.spiders import Spider
from craigslist_sample.items import CraigslistSampleItem
from scrapy.selector import Selector
class MySpider(Spider):
name = "craig"
allowed_domains = ["craigslist.org"]
start_urls = ["http://sfbay.craigslist.org/search/npo"]
def parse(self, response):
links = response.selector.xpath(".//*[@id='sortable-results']//ul//li//p")
for link in links:
content = link.xpath(".//*[@id='titletextonly']").extract()
title = link.xpath("a/@href").extract()
print(title,content)
Elemente:
# Define here the models for your scraped items
from scrapy.item import Item, Field
class CraigslistSampleItem(Item):
title = Field()
link = Field()
Jedoch, wenn ich den crawler habe ich nichts:
$ scrapy crawl --nolog craig
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
So, meine Frage ist: Wie kann ich zu Fuss über jede url, die man in jeden link und Crawlen den Inhalt und den Titel?, und was ist der beste Weg, dies zu tun?.
- Wie kamen Sie mit dem XPath-Ausdrücken?
.//*[@id='sortable-results']//ul//li//p
ok aussieht, sollte es geben Ihnen die<p class="result-info">
auf der Seite. Aber in diesen<p class="result-info">
ich nicht sehen können, etwas passendes.//*[@id='titletextonly']
. Sie können testen Sie Ihre XPaths mitscrapy shell
- Beispiele von scrapy Nutzung oder der XPath? Ich glaube docs.scrapy.org/en/latest/intro/... ist ähnlich zu den use-case.
- Jede website ist anders, und die Daten, die Sie nach Ihrem Anwendungsfall. Vielleicht möchten Sie auch einen Kurs über XPath und diesem blog-post dienen kann, als ein gutes intro.
- Ich werde akzeptieren, dass die Frage, wer mehr haben upvotes, beide waren Super.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie kriechen wollen, möchten Sie vielleicht einen Blick auf
CrawlSpider
.Gerüst zu einer grundlegenden scrapy Projekt, das Sie verwenden können, die Befehl:
Dann fügen Sie die Spinne und Elemente:
Führen Sie die Spinne durch ausführen der Befehl:
Aus der Wurzel des Projekts.
Es sollte eine
craig_ads.csv
im Stammverzeichnis Ihres Projekts.scrapy crawl myspider -o items.csv
und die Datei ist leer... keine Idee warum dies passiert ist?parse_item()
(wir waren nur zu drucken die Artikel für den sake des Beispiels). Ich fügte hinzu, dieyield
, und auch Hinzugefügt, die pipeline an export -CSV
- Dateien. Bitte, lassen Sie mich wissen, ob das hilft.scrapy runspider craig/spiders/test.py
und ich habe nicht die Datei, wieso ist das so?.craig/settings.py
wie angegeben? Nach dem ausführen der Spinne, die Sie normalerweise bekommen Sie einen kleinen Bericht. Auf diesen Bericht, haben Sie eine Linie, die sagt'item_scraped_count': 101,
? Haben Sie sich für die Datei auf dem gleichen Pfad, wo haben Sie standardmäßig die Dateiscrapy.cfg
?Ich versuche, Ihre Frage zu beantworten.
Erste von allen, weil von Ihr falscher XPath-Abfrage, haben Sie leere Ergebnisse. Von einem XPath -
".//*[@id='sortable-results']//ul//li//p"
Sie sich relevante<p>
Knoten korrekt, aber ich weiß nicht, wie Sie Ihre query-Ausdruck. Allerdings habe ich keine Idee von den folgenden XPath-Ausdruck".//*[@id='titletextonly']"
und"a/@href"
konnten Sie nicht finden, link und Titel wie erwartet. Vielleicht dein Sinn ist zu, suchen Sie den text, der Titel und der Link der Titel. Wenn ja, ich glaube, Sie müssen lernen, Xpath, und beginnen Sie bitte mit HTML-DOM.Ich will dich anweisen, wie zu tun XPath-Abfrage, da es viele Ressourcen online. Erwähnen möchte ich einige Funktionen von Scrapy XPath-Selektor:
In standard-XPath-Abfrage, es gibt ein array von DOM-Knoten abgefragt. Sie können die open-development-Modus in Ihrem browser(
F12
), verwenden Sie console-Befehl$x(x_exp)
zu testen. Ich sehr empfehlen, die testen Sie Ihr XPath-Ausdruck, durch diese Weise. Es wird Ihnen sofortige Ergebnisse und eine Menge Zeit sparen. Wenn Sie Zeit haben, vertraut sein mit web-Entwicklungs-tools in Ihrem browser, die Sie haben, werden schnell verstehen, web-Seiten-Struktur und suchen Sie den Eintrag, den Sie suchen.Während, Scrapy
response.xpath(x_exp)
gibt ein array vonSelector
entsprechenden Objekte zu tatsächlichen XPath-Abfrage, die eigentlich eineSelectorList
Objekt. Dies bedeutet XPath-Ergebnisse ist reprented vonSelectorsList
. Und beideSelector
undSelectorList
- Klasse stellt einige nützliche Funktionen zur Bedienung die Ergebnisse:extract
, zurückgeben einer Liste von serialisierte Dokument-nodes (unicode strings)extract_first
, return Skalar,first
desextract
Ergebnissere
- , Rückgabe einer Listere
desextract
Ergebnissere_first
, return Skalar,first
desre
Ergebnisse.Diese Funktionen machen Ihre Programmierung viel bequemer. Ein Beispiel dafür ist, dass Sie rufen
xpath
Funktion direkt aufSelectorList
Objekt. Wenn Sie versuchtlxml
vor, Sie würden sehen, dass dies ist super nützlich: wenn Sie uns anrufen wollenxpath
Funktion auf die Ergebnisse einer früherenxpath
Ergebnisse inlxml
haben Sie zur Iteration über die früheren Ergebnisse. Ein weiteres Beispiel ist, dass, wenn Sie definitiv wissen, dass es höchstens ein element in dieser Liste können Sie mitextract_first
einen skalaren Wert, anstatt mit list-index-Methode (z.B.rlist[0]
) die Ursache wäre aus der index-Ausnahme aus, wenn kein element zugeordnet. Denken Sie daran, dass es immer Ausnahmen, wenn Sie analysieren die web-Seite, seien Sie vorsichtig und robuster Ihrer Programmierung.Wenn Sie das tun Betrieb
node.xpath(x_expr)
, wennx_expr
beginnt mit/
, es ist eine absolute Abfrage XPath-Suche vonroot
; else ifx_expr
beginnt mit.
, ist es eine relativ Abfrage. Dies ist auch darauf hingewiesen, in Normen 2.5 Abgekürzte SyntaxFür Ihre Anwendung ist, müssen Sie wahrscheinlich nach der nächsten Seite. Hier, auf der nächsten Seite Knoten ist leicht zu finden-es gibt weiter-Tasten. Allerdings müssen Sie auch aufpassen, die Zeit zu stoppen, folgende. Achten Sie auf Ihre URL-query-parameter sagen Sie dem URL-Muster Ihrer Anwendung. Hier, um zu bestimmen, Wann zu stoppen, Folgen Sie der nächsten Seite können Sie vergleichen Sie aktuelle Artikel-Reihe mit der Gesamtanzahl der Elemente.
Neu Bearbeitet
War ich ein wenig verwirrt mit der Bedeutung von Inhalt des Links. Jetzt habe ich es, dass @student verkriechen wollte, die Verbindung zu extrahieren, die AD-Inhalte als auch. Das folgende ist eine Lösung.
Wie Sie vielleicht bemerken, dass ich mit Scrapy
Request
Klasse zu Folgen auf der nächsten Seite. Tatsächlich, die Leistung von Anfrage - Klasse ist darüber hinaus, dass-Sie können anfügen die gewünschte Funktion parse für jede Anforderung durch Einstellung des Parameterscallback
.In Schritt 3 habe ich nicht gesetzt
callback
beim senden der nächsten Seite-Anfragen, diese Anfrage umgegangen werden soll, die standardmäßigparse
Funktion. Jetzt kommt zu der angegebenen AD-Seite, eine andere Seite als die vorherigen AD-Listen-Seite. Somit müssen wir definieren eine neue Seite parser-Funktion, sagen wir malparse_ad
, wenn wir senden jede ANZEIGE Seite verlangen, bringen Sie dieseparse_ad
- Funktion, mit der Anfragen.Weiter geht es mit dem überarbeiteten Beispiel-code, das funktioniert für mich:
items.py
Die Spinne
Key-Note -
parse
für die Anforderungen der AD-Liste-Seite undparse_ad
für die Anforderung der angegebenen AD-Seite.Einen Schnappschuss der Ausgabe:
Dank. Hoffe, dass dies hilfreich wäre und Spaß haben.
scrapy crawl demo -o file.csv
ich nicht in eine csv-Datei die Werbe-Inhalte... warum?