Django集成Scrapy项目配置SCRAPY_SETTINGS_MODULE遇模块找不到错误
我来帮你搞定这个问题!你遇到的ModuleNotFoundError: No module named crawling,核心原因是外层的scraper/crawling目录缺少__init__.py文件,导致Python无法将它识别为一个可导入的模块,进而让Scrapy在解析scraper.crawling.crawling.settings路径时出错。
步骤1:修复模块结构
首先,在你的scraper/crawling目录(也就是包含子目录crawling的那个外层目录)中添加一个空的__init__.py文件。现在你的文件夹结构应该变成这样:
├───django-scraper | ├───django_scraper | | ├───settings.py | │ └───__init__.py | ├───scraper | │ ├───crawling | │ │ ├───__init__.py # 新增这个空文件 | │ │ └───crawling | │ │ ├───spiders | │ │ │ └───__init__.py | │ │ ├───settings.py | │ │ └───__init__.py | │ ├───migrations | │ │ └───__init__.py | │ ├───templates | │ │ └───scraper | │ └───__init__.py
Python要求每个作为模块导入的目录都必须包含__init__.py(哪怕是空文件),这样外层的scraper.crawling才能被正确识别为模块,后续的crawling.settings路径也能正常解析。
步骤2:验证环境变量与导入逻辑
你当前设置的环境变量是正确的:
os.environ['SCRAPY_SETTINGS_MODULE'] = 'scraper.crawling.crawling.settings'
确保这段代码在调用get_project_settings()之前执行(比如在Django启动的早期阶段加载)。另外,你提到sys.path已经包含项目根目录C:\Users\georg\Django\django-scraper,这一点没问题,因为scraper目录就在这个根目录下,Python能正常定位到它。
可选:快速调试验证
可以在项目根目录下启动Python交互环境,手动测试导入是否成功:
import sys sys.path.append('C:\\Users\\georg\\Django\\django-scraper') from scraper.crawling.crawling import settings print(settings) # 如果能正常打印模块对象,说明路径没问题
如果导入成功,再调用get_project_settings()就不会报错了。
替代方案(不推荐)
如果不想修改目录结构,你也可以把scraper/crawling目录添加到sys.path中,然后修改环境变量:
import sys import os # 添加外层crawling目录到sys.path sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'scraper', 'crawling')) os.environ['SCRAPY_SETTINGS_MODULE'] = 'crawling.settings'
但这种方法会破坏Python的模块导入规范,长期来看不如第一种方案稳妥。
内容的提问来源于stack exchange,提问作者George

