2013-02-03 55 views
5

我正在用Scrapy抓取一個網站,並希望將結果分成兩部分。通常我會這樣稱呼Scrapy:用Scrapy寫入多個文件

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

這兩個蜘蛛是完全獨立的,完全不通信。此設置適用於較小的網站,但較大的網站只有太多作者才能抓取這樣的內容。

我該如何讓articles蜘蛛告訴authors蜘蛛抓取哪些頁面並保持這種雙文件結構?理想情況下,我寧願不將作者網址寫入文件,然後與其他蜘蛛一起閱讀。

+0

我認爲問題將是文件的大小。這個解決方案不會很好地擴展(我相信你已經注意到了)。你有沒有關於這個數據庫或存儲?一些無模式解決方案會出現在我的腦海裏。我不認爲你只會對2個巨大的文件感到滿意。 – DrColossos

回答

1

最後我用命令行參數作者刮刀:

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

然後,我添加了管道中概述的重複在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 

最後,我通過文章JSON行文件到命令:

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

這不是一個很好的解決方案,但它的工作原理。

0

完全取決於你的業務邏輯,但這裏是我的建議

我很假設每篇文章應該有一個作者/作者。

那麼爲什麼你多次抓取相同的頁面獲取文章&作者?

因此,我認爲您的抓取工具應該只抓取包含作者的文章,因此可以同時使用一個抓取工具提取articl和作者,並使用Scrapy pipeline編寫多個可以分隔文章和作者的json文件。

還有一點是非常大的數據JSON是不推薦使用jsonlines