Python 为列表中的每个url重新启动scrapy

Python 为列表中的每个url重新启动scrapy,python,scrapy,twisted,Python,Scrapy,Twisted,我正在尝试运行一个scrapy机器人,它将为列表中给定的每个url重复运行爬行器。到目前为止,我编写的代码如下 def run_spider(url_list,allowed_list): runner = CrawlerRunner(get_project_settings()) d = runner.crawl('scraper',start_urls=url_list, allowed_domains=allowed_list) d.addBoth(lambda _

我正在尝试运行一个scrapy机器人,它将为列表中给定的每个url重复运行爬行器。到目前为止,我编写的代码如下

def run_spider(url_list,allowed_list):
    runner = CrawlerRunner(get_project_settings())
    d = runner.crawl('scraper',start_urls=url_list, allowed_domains=allowed_list)
    d.addBoth(lambda _: reactor.stop())
    reactor.run()



for start, allowed in zip(start_url,allowedUrl):
    url_list = []
    allowed_list = []
    url_list.append(start)
    allowed_list.append(allowed)
    print(type(url_list),type(allowed_list))
    run_spider(url_list,allowed_list) 
爬行器本身在第一个url上运行正常,但一旦循环到达其url,就会出现错误
twisted.internet.error.reactor或notrestartable
,完整的回溯如下:

Traceback (most recent call last):
  File "C:\brox\Crawler\main.py", line 34, in <module>
    run_spider(url_list,allowed_list)
  File "C:\brox\Crawler\main.py", line 24, in run_spider
    reactor.run()
  File "C:\brox\Crawler\venv\lib\site-packages\twisted\internet\base.py", line 1282, in run
    self.startRunning(installSignalHandlers=installSignalHandlers)
  File "C:\brox\Crawler\venv\lib\site-packages\twisted\internet\base.py", line 1262, in startRunning
    ReactorBase.startRunning(self)
  File "C:\brox\Crawler\venv\lib\site-packages\twisted\internet\base.py", line 765, in startRunning
    raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
回溯(最近一次呼叫最后一次):
文件“C:\brox\Crawler\main.py”,第34行,在
运行爬虫(url列表、允许列表)
文件“C:\brox\Crawler\main.py”,第24行,在run\u spider中
反应堆运行()
文件“C:\brox\Crawler\venv\lib\site packages\twisted\internet\base.py”,第1282行,正在运行
self.startRunning(installSignalHandlers=installSignalHandlers)
文件“C:\brox\Crawler\venv\lib\site packages\twisted\internet\base.py”,第1262行,在startRunning中
反应器基础启动耳轴(自)
文件“C:\brox\Crawler\venv\lib\site packages\twisted\internet\base.py”,第765行,在startRunning中
引发错误。ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
我遵循文档中描述的方法,但是如何为循环中的每个项目重新启动spider。任何建议都会很有帮助


p:S::当只需传递允许的域和启动URL时,蜘蛛机器人本身工作正常

我对scrapy也是新手。但是我会在不重新启动爬虫的情况下编写这个爬虫程序(这是有问题的,因为它需要重新启动反应堆)。大概是这样的:

class MySpider(scrapy.Spider):
    name = 'spidery'
    allowed_domains = ['allowed_list']
    start_urls = url_list
    
    def parse(self, response):
       #here is what you want to scrape

crawler = CrawlerProcess()
crawler.crawl(MySpider)
crawler.start()

我希望这样做

要使代码正常工作,必须重新排列
reactor.run()
reactor.stop()
逻辑。以下是一个解决问题的方法示例:

从scrapy.crawler导入CrawlerRunner
从twisted.internet.defer导入结果
从twisted.internet导入
def运行蜘蛛(url列表、允许列表):
"""
:返回:延迟
"""
runner=CrawlerRunner(获取项目设置()
return runner.crawl('scraper',start\u url=url\u list,allowed\u domains=allowed\u list)
d_列表=[]
对于start,允许在zip中使用(start\u url,allowedUrl):
# ... 你的逻辑。。。
#将延迟的数据追加到列表中。
追加(运行蜘蛛程序(url列表,允许列表))
#“加入”
结果=收集结果(d_列表)
#在所有现场被刮掉或发生故障后,停止反应堆
results.addBoth(lambda 2;:reactor.stop())
反应堆运行()
run\u spider()。在循环中,将
延迟的
附加到列表中,并“加入”所有列表,或在出现故障时停止处理(读取)。一旦所有场地都被刮掉,反应堆将停止运转


在web上搜索
ReactorNotRestartable
,正如前面多次解释的那样。

正如我在问题中所描述的,爬行机器人运行正常,我需要一种方法来停止并重新运行每个url的scrapy。