2017-02-27 60 views
0

我正在使用Scrapy 1.1,並且我有一個項目,其中有蜘蛛'1'刮網站A(我獲得了90%的信息來填充我的項目)。然而,根據Site A Scrape的結果,我可能需要從B站點獲取更多信息。就開發該程序而言,在蜘蛛'1'內部的B站點進行刮擦還是可以進行交互的更有意義站點B在管道對象內。我更喜歡後者,認爲它會去除2個站點的垃圾信息,但我不確定這是否可行或處理此用例的最佳方式。另一種方法可能是爲站點B使用第二個蜘蛛(蜘蛛'2'),但後來我認爲我必須讓蜘蛛'1'運行,保存到db然後運行蜘蛛'2'。無論如何,任何意見將不勝感激。Scrapy:與輔助網站互動時的程序組織

回答

0

這兩種方法都很常見,這只是一個偏好問題。對於包含一個蜘蛛中所有內容的情況,聽起來像是一個簡單的解決方案。

可以URL字段添加到您的項目和計劃,並在管道後對其進行分析:

class MyPipeline(object): 
    def __init__(self, crawler): 
     self.crawler = crawler 

    @classmethod 
    def from_crawler(cls, crawler): 
     return cls(crawler) 

    def process_item(self, item, spider): 
     extra_url = item.get('extra_url', None) 
     if not extra_url: 
      return item 
     req = Request(url=extra_url 
         callback=self.custom_callback, 
         meta={'item': item},) 
     self.crawler.engine.crawl(req, spider) 
     # you have to drop the item here since you will return it later anyway 
     raise DropItem() 

    def custom_callback(self, response): 
     # retrieve your item 
     item = response.mete['item'] 
     # do something to add to item 
     item['some_extra_stuff'] = ... 
     del item['extra_url'] 
     yield item 

什麼上面的代碼的作用是檢查項目是否有一定的URL字段中,如果這樣做,下降的項目並安排新的請求。該請求用一些額外數據填充該項目並將其發送回管道。

+0

謝謝你的例子。我以前從未見過這種方法。 – user61629

+0

我有一個後續問題。 http://stackoverflow.com/questions/42515747/initializing-pipeline-object-with-crawler-in-scrapy – user61629

+0

我會在這裏給你一個賞金給你的幫助。再次感謝。 – user61629