Scrapy:如何从其他python脚本运行spider两次或两次以上?;

Scrapy:如何从其他python脚本运行spider两次或两次以上?;,python,python-2.7,scrapy,twisted,Python,Python 2.7,Scrapy,Twisted,刮擦版:1.0.5 我已经搜索了很长一段时间,但大多数变通方法在当前的版本中都不起作用 My spider在京东_spider.py中定义,运行spider的界面(学习者)如下: # interface def search(keyword): configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'}) runner = CrawlerRunner() d = runner.crawl(JingdongS

刮擦版:1.0.5

我已经搜索了很长一段时间,但大多数变通方法在当前的版本中都不起作用

My spider在京东_spider.py中定义,运行spider的界面(学习者)如下:

# interface
def search(keyword):
    configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
    runner = CrawlerRunner()
    d = runner.crawl(JingdongSpider,keyword)
    d.addBoth(lambda _: reactor.stop())
    reactor.run() # the script will block here until the crawling is finished
然后在temp.py中,我将调用上面的
搜索(关键字)
来运行spider

现在的问题是:我调用了搜索(关键字)一次,效果很好。但我调用了两次,例如

临时

search('iphone')
search('ipad2')
它报告说:

回溯(最近一次调用上次):文件 “C:/Users/jiahao/Desktop/code/bbt\u gramb\u plus/temp.py”,第7行,在 搜索('ipad2')文件“C:\Users\jiahao\Desktop\code\bbt\u gramb\u plus\bbt\u gramb\u plus\spider\jingdong\u spider.py”, 第194行,搜索中 reactor.run()#脚本将在此处阻塞,直到文件爬网完成 “C:\Python27\lib\site packages\twisted\internet\base.py”,第1193行, 在逃 self.startRunning(installSignalHandlers=installSignalHandlers)文件“C:\Python27\lib\site packages\twisted\internet\base.py”,第行 1173,在startRunning ReactorBase.startRunning(self)文件“C:\Python27\lib\site packages\twisted\internet\base.py”,第684行,在 星形耳轴 引发错误.ReactorNotRestartable()twisted.internet.error.ReactorNotRestartable

第一次搜索(关键字)成功,但后一次搜索出错


您能帮忙吗?

在您的代码示例中,您正在调用twisted.reactor,并在每次函数调用时启动它。这不起作用,因为每个过程只有一个反应器,而您不能

有两种方法可以解决您的问题,请参见。要么坚持使用CrawlerRunner,要么将reactor.run()移动到
search()函数之外,以确保只调用一次。或者使用
CrawlerProcess
,只需调用
crawler\u process.start()
。第二种方法更简单,您的代码如下所示:

from scrapy.crawler import CrawlerProcess
from dirbot.spiders.dmoz import DmozSpider

def search(runner, keyword):
    return runner.crawl(DmozSpider, keyword)

runner = CrawlerProcess()
search(runner, "alfa")
search(runner, "beta")
runner.start()
正如帕维尔·米奇所说


在代码示例中,您正在调用twisted.reactor 它在每次函数调用中都会显示。这不起作用,因为只有 每个过程一个反应器,不能启动两次

我找到了解决问题的办法。只是使用多处理

它将像:

from multiprocessing import Process
def run_spider(keyword):
    if __name__ == '__main__':
        p = Process(target=jingdong_spider.search, args=(keyword.encode('utf-8'),))
        p.start()
        p.join()

如果每个人在使用python多处理时都有问题。最好看看python文档。

谢谢。你的答案很棒,但我需要在输入内容时使用
搜索(关键字)
。i、 e,
search(关键字)
需要在用户做某事时调用(如单击按钮等)。这样
search(关键字)
就不能硬编码。最后,我用多重处理解决了我的问题。恐怕我没有解释清楚<代码>搜索(关键字)
可以调用两次、三次、四次。。。这要看情况了。我有错误
processCrawl=CrawlerProcess(get\u project\u settings())
在某些函数中,当我再次调用时,它说
twisted.internet.error.ReactorNotRestartable
尽管这是一个悬而未决的解决方法,但它工作得很好。你救了我一天!我有50分钟的时间来完成我的项目。我犯了一个错误<代码>p.start()文件“/usr/local/lib/python3.6/multiprocessing/process.py”,第103行,在start“守护进程不允许有子进程”