Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在顺序爬行器之间传递数据_Python_Web Scraping_Scrapy_Sequential - Fatal编程技术网

Python 如何在顺序爬行器之间传递数据

Python 如何在顺序爬行器之间传递数据,python,web-scraping,scrapy,sequential,Python,Web Scraping,Scrapy,Sequential,我有两个蜘蛛,它们按照顺序运行。现在,我想将一些信息从第一个spider传递到第二个spider(SeleniumWebDriver,或者它的会话信息) 我对scrapy很陌生,但在另一篇文章中,有人建议将数据保存到数据库中,然后从数据库中检索数据。这对于仅仅传递一个变量来说似乎有点太多了,难道没有其他方法吗? (我知道在本例中,我可以将其制作成一个长的spider,但稍后我想运行第一个spider一次,但运行第二个spider多次。) class Spider1(scrapy.Spider):

我有两个蜘蛛,它们按照顺序运行。现在,我想将一些信息从第一个spider传递到第二个spider(SeleniumWebDriver,或者它的会话信息)

我对scrapy很陌生,但在另一篇文章中,有人建议将数据保存到数据库中,然后从数据库中检索数据。这对于仅仅传递一个变量来说似乎有点太多了,难道没有其他方法吗? (我知道在本例中,我可以将其制作成一个长的spider,但稍后我想运行第一个spider一次,但运行第二个spider多次。)

class Spider1(scrapy.Spider):
#打开webdriver并获取会话\u id
蜘蛛2类(刮毛蜘蛛):
#获取会话id并运行spider2代码
定义初始化(self,session\u id):
...
配置日志记录()
runner=CrawlerRunner()
@defer.inlineCallbacks
def crawl():
爬行(蜘蛛1)
#TODO如何获取会话\u id?
#session_id=yield runner.crawl(Spider1)返回None
#或者在Spider 1中添加return语句,实际上会中断
#顺序处理和程序在运行Spider1之前休眠
时间。睡眠(2)
屈服跑步者爬网(蜘蛛2(会话id))
反应堆停止()
爬行
reactor.run()#脚本将在此阻塞,直到最后一次爬网调用完成
我想将变量传递给第二个spider的构造函数,但无法从第一个spider获取数据。如果我只是运行第一个爬虫程序来返回变量,它显然会破坏顺序结构。如果我尝试检索收益率,结果是零


我完全失明了吗?我不敢相信这会是一项如此复杂的任务。

您可以将队列传递给两个spider,并让
spider2
阻塞queue.get(),这样就不需要
time.sleep(2)

#globals.py
队列=队列()
#run.py
导入全局
蜘蛛1类(刮毛蜘蛛):
定义初始化(自):
#将session_id放在“Spider1”中的“globals.queue”中,以便“Spider2”可以启动。
...
蜘蛛2类(刮毛蜘蛛):
定义初始化(自):
session_id=globals.queue.get()
配置日志记录()
runner=CrawlerRunner()
@defer.inlineCallbacks
def crawl():
爬行(蜘蛛1)
爬行(蜘蛛2)
反应堆停止()
爬行
反应堆运行()

您也可以在之前创建webdriver并将其作为参数传递。当我最初尝试这个方法时,它没有起作用,因为我错误地传递了参数(参见我在文章中的评论)


很好的解决方案。仅供参考,在globals.py中,我使用了queuelib.queue import FifoMemoryQueue中的
,我意识到上述代码的真正问题是什么。我将变量传递给第二个spider的方式是错误的。它需要是
yield runner.crawl(Spider2,session\u id=session\u id)
。此错误使爬行器初始化两次,并在第一次初始化后丢失参数。
class Spider1(scrapy.Spider):
    def __init__(self, driver=None):
        self.driver = driver # Do whatever with the driver

class Spider2(scrapy.Spider):
   def __init__(self, driver=None):
       self.driver = driver # This is the same driver as Spider 1 used


configure_logging()
runner = CrawlerRunner()

@defer.inlineCallbacks
def crawl():
    driver = webdriver.Chrome()

    yield runner.crawl(Spider1, driver=driver)
    yield runner.crawl(Spider2, driver=driver)

    reactor.stop()

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