2013-02-03 13 views
5

Ich kratze eine Website mit Scrapy und möchte die Ergebnisse in zwei Teile aufteilen. Normalerweise rufe ich Scrapy wie folgt an:Schreiben in mehrere Dateien mit Scrapy

$ scrapy crawl articles -o articles.json 
$ scrapy crawl authors -o authors.json 

Die beiden Spinnen sind völlig unabhängig und kommunizieren überhaupt nicht. Dieses Setup funktioniert für kleinere Websites, aber größere Websites haben einfach zu viele Autoren, um so zu crawlen.

Wie hätte ich die articles Spinne sagen die authors Spider welche Seiten zu crawlen und pflegen diese Zwei-Datei-Struktur? Im Idealfall würde ich die Autoren-URLs lieber nicht in eine Datei schreiben und sie dann mit der anderen Spinne lesen.

+0

Ich denke, das Problem wird die Größe der Dateien sein. Diese Lösung wird nicht sehr gut skalieren (wie Sie sicher schon bemerkt haben). Hast du das schon über eine Datenbank oder -Store? Irgendeine schemalose Lösung würde mir dafür einfallen. Ich glaube nicht, dass Sie nur mit 2 riesigen Dateien zufrieden sein werden. – DrColossos

Antwort

1

I Befehlszeilenargumente für den Autor Schaber endete:

class AuthorSpider(BaseSpider): 
    ... 

    def __init__(self, articles): 
     self.start_urls = [] 

     for line in articles: 
      article = json.loads(line) 
      self.start_urls.append(data['author_url']) 

Dann habe ich die Duplikate Pipeline skizziert in die Scrapy documentation:

from scrapy import signals 
from scrapy.exceptions import DropItem 

class DuplicatesPipeline(object): 
    def __init__(self): 
     self.ids_seen = set() 

    def process_item(self, item, spider): 
     if item['id'] in self.ids_seen: 
      raise DropItem("Duplicate item found: %s" % item) 
     else: 
      self.ids_seen.add(item['id']) 
      return item 

Schließlich habe ich die Artikel JSON Zeilen in der Eingabedatei:

$ scrapy crawl authors -o authors.json -a articles=articles.json 

Es ist keine großartige Lösung, aber es funktioniert.

0

hängt alles von Ihrer Business-Logik, aber hier ist mein Vorschlag

ich bin jeden Artikel der Annahme, sollte ein Autor/Autoren haben.

also warum Sie dieselbe Seite mehrere Male kriechen, um Artikel zu bekommen & Autoren?

so denke ich, dass Ihr Crawler nur Artikel crawlen sollte, die auch Autoren enthalten sollten, also articl und Autor gleichzeitig mit einem Schaber extrahieren und Scarpy pipeline verwenden, um mehrere json Dateien zu schreiben, die Artikel und Autoren trennen können.

ein weiterer Punkt für sehr große Daten json ist, Anwendung nicht empfohlen jsonlines