Scrapy:如何从其他python脚本运行蜘蛛两次或更多次?

guo*_*guo 4 python twisted scrapy python-2.7

Scrapy版本:1.0.5

我已经搜索了很长时间,但是大多数解决方法在当前的Scrapy版本中不起作用。

我的蜘蛛定义在jingdong_spider.py中,运行蜘蛛的界面(由Scrapy Documentation学习)如下:

# 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
Run Code Online (Sandbox Code Playgroud)

然后在temp.py中,我将调用search(keyword)以上代码来运行Spider。

现在的问题是:我曾经打电话给search(keyword),但效果很好。但是,例如,我两次打电话给它,

在临时

search('iphone')
search('ipad2')
Run Code Online (Sandbox Code Playgroud)

它报告:

追溯(最近一次通话):文件“ C:/Users/jiahao/Desktop/code/bbt_climb_plus/temp.py”,第7行,在search('ipad2')中,文件“ C:\ Users \ jiahao \ Desktop \ code \ bbt_climb_plus \ bbt_climb_plus \ spiders \ jingdong_spider.py”,位于第194行,位于搜索React.run。 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,在startRunning中引发error.ReactorNotRestartable()twisted.internet.error.ReactorNotRestartable

第一个搜索(关键字)成功,但是后一个错误。

你能帮忙吗?

Paw*_*ech 5

在您的代码示例中,您将对twisted.reactor进行调用,并在每次函数调用时将其启动。这是行不通的,因为每个进程只有一个反应器,您不能启动两次

有两种方法可以解决您的问题,这两种方法都在此处的文档中进行了介绍。无论是坚持使用CrawlerRunner,但移动reactor.run()你之外search()的功能,以确保它仅调用一次。或使用CrawlerProcess并简单地致电crawler_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()
Run Code Online (Sandbox Code Playgroud)

  • 恐怕我没有解释清楚。搜索(关键字)可能被调用两次,三次,四次……这取决于。 (2认同)

guo*_*guo 5

正如 Pawel Miech 所说

在您的代码示例中,您正在调用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()
Run Code Online (Sandbox Code Playgroud)

如果每个人都在使用 python-multiprocessing 时遇到问题。最好查看 python 文档。