CrawlerProcess与CrawlerRunner

时间:2016-09-26 14:52:59

标签: python web-scraping scrapy

Scrapy 1.x documentation解释说,有两种方法可以从脚本中运行Scrapy蜘蛛

两者有什么区别?我什么时候应该使用“过程”和“跑步者”?

2 个答案:

答案 0 :(得分:25)

Scrapy的文档在提供两者的实际应用示例方面做得非常糟糕。

CrawlerProcess假设scrapy是唯一使用扭曲反应器的东西。如果你在python中使用线程来运行其他代码,那么这并不总是正确的。我们以此为例。

from scrapy.crawler import CrawlerProcess
import scrapy
def notThreadSafe(x):
    """do something that isn't thread-safe"""
    # ...
class MySpider1(scrapy.Spider):
    # Your first spider definition
    ...

class MySpider2(scrapy.Spider):
    # Your second spider definition
    ...

process = CrawlerProcess()
process.crawl(MySpider1)
process.crawl(MySpider2)
process.start() # the script will block here until all crawling jobs are finished
notThreadSafe(3) # it will get executed when the crawlers stop

现在,正如您所看到的,该功能仅在爬虫停止时执行,如果我希望在爬虫爬行到同一个反应堆时执行该功能,该怎么办?

from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
import scrapy

def notThreadSafe(x):
    """do something that isn't thread-safe"""
    # ...

class MySpider1(scrapy.Spider):
    # Your first spider definition
    ...

class MySpider2(scrapy.Spider):
    # Your second spider definition
    ...
runner = CrawlerRunner()
runner.crawl(MySpider1)
runner.crawl(MySpider2)
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.callFromThread(notThreadSafe, 3)
reactor.run() #it will run both crawlers and code inside the function

Runner类不限于此功能,您可能需要在reactor上进行一些自定义设置(延迟,线程,getPage,自定义错误报告等)

答案 1 :(得分:2)

CrawlerRunner:

  

除非编写手动处理爬网过程的脚本,否则不应该需要此类(因为Scrapy负责相应地使用它)。有关示例,请参阅脚本中的Run Scrapy。

CrawlerProcess:

  

如果您没有在应用程序中运行另一个Twisted反应器,那么此实用程序应该比CrawlerRunner更合适。

除非您将抓取工具添加到现有的Twisted应用程序中,否则听起来像CrawlerProcess。