Scrapy 1.x documentation解释说,有两种方法可以从脚本中运行Scrapy蜘蛛:
两者有什么区别?我什么时候应该使用“过程”和“跑步者”?
答案 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。