2016-03-20 91 views
2
Class Myspider1 
#do something.... 

Class Myspider2 
#do something... 

以上是我的spider.py文件的体系结构。我试图首先运行Myspider1,然后根据一些条件运行Myspider2倍数。我怎么能这样做?有小费吗?依次运行多个Spider

configure_logging() 
runner = CrawlerRunner() 
def crawl(): 
    yield runner.crawl(Myspider1,arg.....) 
    yield runner.crawl(Myspider2,arg.....) 
crawl() 
reactor.run() 

我想使用这种方式,但不知道如何运行它。我应该在cmd上运行cmd(什么命令?)或者只是运行python文件?

非常感谢!

+0

您只需运行python脚本本身。这就是CrawlerProcess + CrawlerRunner构建的类。但请澄清你谈论的条件。在运行脚本之前是定义了这些条件,还是在第一个Spider类运行期间/从这些条件中检索到这些条件? – dron22

+0

感谢您的回复,对于这两个蜘蛛,第一个蜘蛛Myspider1负责抓取一系列链接,第二个蜘蛛Myspider2负责抓取以前链接中缺少的链接(链接用于Spider1),所以我必须首先运行第一个蜘蛛,一旦它关闭,找到是否有任何网址缺失,并选择打开蜘蛛2或不。 –

回答

1

运行Python文件
例如: test.py

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

class MySpider1(scrapy.Spider): 
    # Your first spider definition 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" 
    ] 

    def parse(self, response): 
     print "first spider" 

class MySpider2(scrapy.Spider): 
    # Your second spider definition 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
    ] 

    def parse(self, response): 
     print "second spider" 

configure_logging() 
runner = CrawlerRunner() 

@defer.inlineCallbacks 
def crawl(): 
    yield runner.crawl(MySpider1) 
    yield runner.crawl(MySpider2) 
    reactor.stop() 

crawl() 
reactor.run() # the script will block here until the last crawl call is finished 

现在运行蟒蛇test.py> output.txt的
您可以从output.txt的观察你的蜘蛛依次运行。

+0

是否有可能将爬行()更改为我在范围(1,10):runner。爬行(MySpider,args [i * 2])runner.crawl(MySpider,args [i * 2 + 1)d = runner.join()yield d?我想并行运行2个蜘蛛,但要让它们按顺序运行N次...... –

+0

嗯,它确实有点工作(我的第一条评论)......唯一的缺点是它会等待所有“并行”任务在执行更多“并行”任务之前完成 - 如果经常发生一个任务比其他任务长得多,则它实际上变为顺序而不是并行... –