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
第一个搜索(关键字)成功,但是后一个错误。
你能帮忙吗?
在您的代码示例中,您将对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)
正如 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 文档。
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |