先上结论:除非每次运行爬虫前都重启一次kernel,否则爬虫部分代码只能运行一次,第二次就会报错,无解。
原因:
scrapy的网络部件基于twisted构建,整个爬虫都在twisted reactor的事件循环中执行,且每个线程只能有一个reactor实例。一旦爬虫执行完毕,reactor也就没有了其他作用,很自然的在代码中,我们会指定回调函数reactor.stop()
from spiders.test import QuotesSpider
from twisted.internet import reactor
from twisted.internet import defer
import scrapy
from scrapy.crawler import CrawlerRunner