2010-10-06 12 views
13

Ich benutze scrapy, um täglich eine Nachrichtenwebsite zu crawlen. Wie schränke ich scrapy vom Schaben bereits gekratzter URLs ein. Gibt es auch eine klare Dokumentation oder Beispiele auf SgmlLinkExtractor.Scrapy - wie man bereits geschabte URLs identifiziert

+1

Um dies zu tun, müssen Sie die URLs speichern, die Sie geschabt haben. Machst du das? Wenn das so ist, wie? –

Antwort

0

Dies ist unkompliziert. Pflegen Sie alle zuvor gecrawlten URLs in python dict. Wenn Sie also versuchen, sie das nächste Mal zu versuchen, sehen Sie, ob diese URL im Diktat vorhanden ist. sonst kriechen.

Der obige Code wurde in SO Texteditor aka Browser eingegeben. Könnte Syntaxfehler haben. Möglicherweise müssen Sie auch einige Änderungen vornehmen. Aber die Logik ist da ...

HINWEIS: Aber Vorsicht, dass einige Websites ständig ihren Inhalt ändern. Manchmal müssen Sie möglicherweise eine bestimmte Webseite (d. H. Dieselbe URL) erneut durchsuchen, um den aktualisierten Inhalt zu erhalten.

+3

Es wäre besser, ein Set als ein Diktat in diesem Fall zu verwenden. –

13

Sie können tatsächlich tun dies ganz einfach mit dem scrapy Schnipsel hier zu finden: http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/

es zu verwenden, den Code aus dem Link kopieren und in eine Datei in Ihrem scrapy Projekt gesteckt. es zu beziehen, ist eine Zeile in Ihrer settings.py fügen Sie es verweisen:

SPIDER_MIDDLEWARES = { 'project.middlewares.ignore.IgnoreVisitedItems': 560 } 

Die Besonderheiten auf, warum Sie die Nummer wählen, die Sie hier lesen werden können: http://doc.scrapy.org/en/latest/topics/downloader-middleware.html

Schließlich Sie‘ Sie müssen Ihre items.py so ändern, dass jede Elementklasse die folgenden Felder hat:

visit_id = Field() 
visit_status = Field() 

Und ich denke, das ist es. Wenn Sie das Spider-Programm das nächste Mal ausführen, sollte es automatisch versuchen, die gleichen Websites zu meiden.

Viel Glück!

+0

Ich habe alles gemacht wie du erwähnt hast, aber das hat nicht geholfen. Es kriecht immer noch dieselbe URL. –

+0

Der Link erwähnt ist hier: http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/ jetzt. – vrleboss

+0

Nun, ich folgte diesen Schritten, es weist eine visit_id und visit_status als neu. Aber scannt die gleichen Elemente immer wieder in jedem Lauf (und weist dieselbe visit_id und visit_status als neu zu). Irgendwelche Hinweise? – Anshu

1

Ich denke, Jama22's Antwort ist ein wenig unvollständig.

Im Snippet if self.FILTER_VISITED in x.meta: können Sie sehen, dass Sie FILTER_VISITED in Ihrer Request-Instanz benötigen, damit diese Anfrage ignoriert wird. Dies stellt sicher, dass Sie zwischen Links, die Sie durchqueren und verschieben möchten, und Element-Links, die Sie nicht sehen möchten, unterscheiden können.

1

Scrapy kann automatisch URLs filtern, die geschabt werden, nicht wahr? Einige URLs, die auf dieselbe Seite verweisen, werden nicht gefiltert, z. B. "www.xxx.com/home/" und "www.xxx.com/home/index.html".

Verwandte Themen