Scrapy:如何从其他python脚本运行spider两次或两次以上?;
刮擦版:1.0.5 我已经搜索了很长一段时间,但大多数变通方法在当前的版本中都不起作用 My spider在京东_spider.py中定义,运行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
# 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“守护进程不允许有子进程”