2012-09-01 9 views
10

Skrobię stronę z piłką nożną, a pająk (pojedynczy pająk) dostaje kilka rodzajów przedmiotów ze stron witryny: Zespół, Mecz, Klub itp. Próbuję użyj CSVItemExporter do przechowywania tych elementów w oddzielnych plikach CSV, teams.csv, matches.csv, clubs.csv itp.W jaki sposób scrapy mogą eksportować elementy do oddzielnych plików CSV na element

Nie jestem pewien, co jest właściwym sposobem, aby to zrobić. Jedyny sposób, jaki dotychczas sądziłem, to stworzenie własnego niestandardowego potoku, jak w przykładzie http://doc.scrapy.org/en/0.14/topics/exporters.html i tam należy otworzyć wszystkie potrzebne pliki csv w metodzie spider_opened, tj. Utworzyć eksportera csv dla każdego pliku csv oraz w kodzie umieszczonym w process_item dowiedzieć się, jaki rodzaj pozycji jest parametrem "przedmiot", a następnie wysłać go do odpowiedniego obiektu eksportera.

W każdym razie nie znalazłem żadnych przykładów obsługi wielu plików CSV (według typu przedmiotu) w scrapy więc niepokoję się, że używam go w sposób, który nie jest przeznaczony do użycia. (to moje pierwsze doświadczenie ze Scrapy).

diomedes

Odpowiedz

10

Podejście wydaje mi się w porządku. Piplines są świetną cechą Scrapy i są stworzone przez IMO dla czegoś takiego jak twoje podejście.

Możesz utworzyć wiele przedmiotów (np. SoccerItem, MatchItem), a w swoim MultiCSVItemPipeline po prostu przekazać każdy przedmiot do jego własnej klasy CSV, sprawdzając klasę przedmiotu.

+0

OK, po napisaniu MultiCSVItemPipeline czuję się lepiej :-). Sprawdzam, jak zasugerowałeś klasę przedmiotu, aby dowiedzieć się, gdzie idzie przedmiot. Daję sobie odpowiedź, aby pokazać kod każdemu, kto ma to samo pytanie. – Diomedes

13

Zamieszczam tutaj kod, którego użyłem do wyprodukowania MultiCSVItemPipeline na podstawie odpowiedzi drcolossos powyżej.

Rurociąg ten zakłada, że ​​wszystkie klasy elementów są zgodne z konwencją * Element (na przykład TeamItem, EventItem) i tworzy plik team.csv, event.csv i wysyła wszystkie rekordy do odpowiednich plików CSV.

from scrapy.exporters import CsvItemExporter 
from scrapy import signals 
from scrapy.xlib.pydispatch import dispatcher 


def item_type(item): 
    return type(item).__name__.replace('Item','').lower() # TeamItem => team 

class MultiCSVItemPipeline(object): 
    SaveTypes = ['team','club','event', 'match'] 
    def __init__(self): 
     dispatcher.connect(self.spider_opened, signal=signals.spider_opened) 
     dispatcher.connect(self.spider_closed, signal=signals.spider_closed) 

    def spider_opened(self, spider): 
     self.files = dict([ (name, open(CSVDir+name+'.csv','w+b')) for name in self.SaveTypes ]) 
     self.exporters = dict([ (name,CsvItemExporter(self.files[name])) for name in self.SaveTypes]) 
     [e.start_exporting() for e in self.exporters.values()] 

    def spider_closed(self, spider): 
     [e.finish_exporting() for e in self.exporters.values()] 
     [f.close() for f in self.files.values()] 

    def process_item(self, item, spider): 
     what = item_type(item) 
     if what in set(self.SaveTypes): 
      self.exporters[what].export_item(item) 
     return item 
+0

Czy możesz podać kod, do którego importujesz niektóre moduły? –

Powiązane problemy