2017-08-02 67 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中读取以生成它的起点。