2013-02-03 45 views
5

Tôi đang cạo một trang web có Scrapy và muốn chia kết quả thành hai phần. Thông thường tôi gọi Scrapy như thế này:Viết cho nhiều tệp bằng Scrapy

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

Hai con nhện hoàn toàn độc lập và không giao tiếp chút nào. Thiết lập này hoạt động cho các trang web nhỏ hơn, nhưng các trang web lớn hơn chỉ có quá nhiều tác giả để tôi thu thập thông tin như thế này.

Làm cách nào để có một con nhện articles cho biết các trang cần thu thập thông tin và duy trì cấu trúc hai tệp này? Lý tưởng nhất là, tôi không muốn viết URL của tác giả vào một tệp và sau đó đọc lại với con nhện khác.

+0

Tôi nghĩ rằng vấn đề sẽ là kích thước của các tệp. Giải pháp này sẽ không mở rộng rất tốt (như tôi chắc chắn bạn đã nhận thấy). có bạn mặc dù về một cơ sở dữ liệu hoặc kho cho điều này? Một số giải pháp lược đồ-ít hơn sẽ đến với tâm trí của tôi cho việc này. Tôi không nghĩ bạn sẽ hài lòng với chỉ 2 tệp lớn. – DrColossos

Trả lời

1

tôi đã kết thúc sử dụng đối số dòng lệnh cho tác giả scraper:

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']) 

Sau đó, tôi đã thêm các bản sao đường ống dẫn được nêu trong các 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 

Cuối cùng, tôi đã thông qua bài viết các dòng JSON tập tin vào lệnh:

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

Nó không phải là một giải pháp tuyệt vời, nhưng nó hoạt động.

0

tất cả phụ thuộc vào logic kinh doanh của bạn, nhưng đây là đề xuất của tôi

tôi giả sử mỗi bài viết phải có tác giả/tác giả.

vậy tại sao bạn đang thu thập dữ liệu cùng một trang nhiều lần để nhận bài viết & tác giả?

vì vậy tôi cho rằng trình thu thập thông tin của bạn chỉ nên thu thập thông tin các bài viết có chứa tác giả, đồng thời trích xuất articl và tác giả cùng một lúc bằng một scraper và Sử dụng Scrapy pipeline để viết nhiều tệp json.

một điểm nữa là cho json dữ liệu rất lớn không được khuyến khích sử dụng jsonlines