2012-09-01 22 views
10

Tôi đang cạo một trang web bóng đá và nhện (một con nhện đơn) nhận được một số mục từ các trang của trang web: Đội, Trận đấu, Câu lạc bộ, v.v. Tôi đang cố gắng sử dụng CSVItemExporter để lưu trữ các mục này trong các tệp csv riêng lẻ, các nhóm.csv, matches.csv, clubs.csv, v.v.Làm cách nào để có thể xuất các tệp csv cho mỗi mục

Tôi không chắc chắn cách thức phù hợp để thực hiện điều này là gì. Cách duy nhất tôi đã nghĩ cho đến nay là tạo đường dẫn tùy chỉnh của riêng tôi như trong ví dụ http://doc.scrapy.org/en/0.14/topics/exporters.html và có tất cả các tệp csv cần thiết trong phương thức spider_opened, tức là tạo một nhà xuất bản csv cho mỗi tệp csv và trong process_item đặt mã tìm ra loại mục nào là thông số "mục" và sau đó gửi nó tới đối tượng xuất khẩu tương ứng.

Dù sao tôi không tìm thấy bất kỳ ví dụ nào về xử lý nhiều tệp csv (mỗi loại mục) trong mẩu tin lưu niệm nên tôi lo rằng tôi đang sử dụng nó theo cách không được sử dụng. (đây là trải nghiệm đầu tiên của tôi với Scrapy).

diomedes

Trả lời

10

Phương pháp tiếp cận của bạn có vẻ ổn với tôi. Piplines là một tính năng tuyệt vời của Scrapy và là IMO xây dựng cho một cái gì đó giống như cách tiếp cận của bạn.

Bạn có thể tạo nhiều mục (ví dụ: SoccerItem, MatchItem) và trong MultiCSVItemPipeline chỉ ủy quyền từng mục cho lớp CSV của riêng nó bằng cách chọn lớp mục.

+0

Ok, sau khi viết MultiCSVItemPipeline tôi cảm thấy tốt hơn :-). Tôi kiểm tra khi bạn đề xuất lớp mục để tìm ra nơi mục đó đi. Tôi đưa ra một câu trả lời tự để hiển thị mã cho bất kỳ ai có cùng một câu hỏi. – Diomedes

13

Tôi đăng ở đây mã tôi đã sử dụng để tạo ra một MultiCSVItemPipeline dựa trên câu trả lời của drcolossos ở trên.

Đường ống này giả định rằng tất cả các Hạng mục tuân theo quy ước * Mục (ví dụ: TeamItem, EventItem) và tạo các tệp team.csv, event.csv và gửi tất cả các bản ghi đến tệp csv thích hợp.

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

Bạn có thể đưa mã vào nơi bạn nhập một số mô-đun không? –

Các vấn đề liên quan