为什么Scrapy的CrawlerProcess传入get_project_settings会导致代码重复执行?
问题原因
你遇到的重复执行现象本质不是执行指针回退,是你的主执行代码直接写在了模块顶层,没有加if __name__ == "__main__"保护:
当你传入get_project_settings()初始化CrawlerProcess时,Scrapy底层加载项目配置、初始化Twisted反应器的流程会触发主模块的二次导入,Python在spawn进程启动模式(Windows、macOS系统默认模式)下会重新执行主脚本的所有顶层代码,就出现了print("check")执行两次的现象。
不带参数初始化CrawlerProcess时使用默认空配置,不会触发模块重导入流程,因此不会出现重复执行的问题。你的未调用爬虫、settings配置均和该问题无关。
解决方案
将所有执行逻辑移到if __name__ == "__main__"代码块内即可,修改后代码参考:
# 模块导入、工具函数等可以放在顶层 from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings # 其他你的导入逻辑 if __name__ == "__main__": print("check") process = CrawlerProcess(get_project_settings()) process.crawl('BoxOfficeSpider', df=movie_data) process.start()
内容的提问来源于stack exchange,提问作者Nikhil Jindia
相关产品推荐
相关产品推荐

