2017-08-02 35 views
1

所以問題是我有一個蜘蛛爬過一個網站,颳了一堆產品信息...然後我想有另一個產品列表首先建立鏈接,並將其用於檢查目的。Scrapy有一個蜘蛛使用另一個嵌入的屬性

我意識到我可以在一個蜘蛛中完成這一切,但蜘蛛已經非常大(是25個不同域的通用蜘蛛),並希望保持這個儘可能分離。目前我創建這個主蜘蛛的情況下,像如下:

def run_spiders(*urls, ajax=False): 
    process = CrawlerProcess(get_project_settings()) 
    for url in urls: 
     process.crawl(MasterSpider, start_page = url, ajax_rendered = ajax) 
    process.start() 

理想的情況下如何做到這一點的工作就像是在下面看到的東西:

我嘗試在MasterSpider的closed_handler內產生另一個爬蟲程序,但反應堆已經運行得如此清晰這不會起作用。有任何想法嗎?

請注意,無論何時我嘗試切換到爬蟲跑步者,即使我按照文檔中的確切內容/問題行事,它也不會完全正常工作。我在考慮使用from_crawler可能是我的方式,但我不完全確定

回答

0

要在腳本中鏈接多個搜尋器,您需要深入Twisted延遲。 Official docs have this作爲潛在的解決方案。

根據該代碼片段,我們可以這樣創造的東西:

from twisted.internet import reactor, defer 
import scrapy 
from scrapy.crawler import CrawlerRunner 
from scrapy.utils.log import configure_logging 
from scrapy import signals 

DATA = [] 

def store_item(*args, **kwargs): 
    DATA.append(kwargs['item']) 


class ProducerSpider(scrapy.Spider): 
    name = 'spider1' 
    start_urls = ['http://stackoverflow.com'] 

    def parse(self, response): 
     yield {'url': response.url} 


class ConsumerSpider(scrapy.Spider): 
    name = 'spider2' 

    def start_requests(self): 
     for item in DATA: 
      yield scrapy.Request(item['url']) 

    def parse(self, response): 
     yield {'url': response.url} 


configure_logging() 
runner = CrawlerRunner() 


@defer.inlineCallbacks 
def crawl(): 
    crawler1 = runner.create_crawler(ProducerSpider) 
    crawler2 = runner.create_crawler(ConsumerSpider) 
    crawler1.signals.connect(store_item, signals.item_scraped) 
    crawler2.signals.connect(store_item, signals.item_scraped) 
    yield runner.crawl(crawler1) 
    yield runner.crawl(crawler2) 
    reactor.stop() 


crawl() 
reactor.run() # the script will block here until the last crawl call is finished 
print('TOTAL RESULTS:') 
print(DATA) 

這是一個有點長,哈克,但它看起來它並不複雜:

  1. 創建兩個蜘蛛類和一個可訪問/全局變量通過調用DATA
  2. 創建CrawlerRunner實例來管理爬網。
  3. 爲每個蜘蛛創建一個爬蟲並將它們鏈接到我們的跑步者。
  4. 添加信號到那些我們的兩根履帶自己的物品存放到我們的共享變量DATA

所以第一履帶抓取,並通過store_item功能,只是其附加到DATA把每一個項目。然後第二個爬蟲啓動,它的start_requests方法直接從DATA中讀取以生成它的起點。