我正在按照this的答案在Django的Scrapy项目中获取蜘蛛列表,因此结构如下所示。
my_app/
-- apps/ # django apps folder
-- crawler/
-- __init__.py
-- admin.py
-- apps.py
-- views.py <~ here is where the code below located
-- etc..
-- my_app/ # django project folder
-- __init__.py
-- asgi.py
-- settings.py
-- etc..
-- scraper_app/ # scrapy dir
-- scraper_app/ # scrapy project folder
-- spiders/
-- abc_spider.py
-- __init__.py
-- middlewares.py
-- pipelines.py
-- settings.py
-- etc..
-- scrapy.cfg
-- manage.py
-- scrapyd.conf
-- setup.py
-- etc..
,这是一段代码,显示了当我在scrapy shell
上运行时可用的蜘蛛列表,但是当我尝试从{{1}中的django应用程序运行它时,它总是返回一个空字符串},即爬虫应用程序。
views.py
所以我的问题是,如何使用Django或Scrapy方式使这些脚本在django项目上正常工作?谢谢
已编辑
我只是意识到,当我尝试在刮{的外壳程序中从project_settings = project.get_project_settings()
spider_loader = spiderloader.SpiderLoader.from_settings(project_settings)
spiders = spider_loader.list()
获取值时,它将返回
project.get_project_settings()
但是当我尝试从Django运行它时,'SPIDER_MODULES': ['scraper_app.spiders']
返回一个空列表
答案 0 :(得分:0)
您应该将scraper与Django集成在一起。
例如在Django settings.py
中:
import os
import sys
# DJANGO INTEGRATION
sys.path.append(os.path.dirname(os.path.abspath('.')))
os.environ['DJANGO_SETTINGS_MODULE'] = '<scrapper>.settings'
答案 1 :(得分:0)
我问了这个问题已经很久了,但是我终于找到了对我来说最好的答案,而且是最干净的方法,而没有使用os
模块。
from scrapy.utils import project
from scrapy import spiderloader
project_settings = project.get_project_settings()
project_settings.set('SPIDER_MODULES', ['path.to.scrapy.spiders'])
project_settings.set('NEWSPIDER_MODULE', 'path.to.scrapy.spiders')
spider_loader = spiderloader.SpiderLoader.from_settings(project_settings)
spiders = spider_loader.list()
因此在我的解决方案中,我只需要重新分配/替换设置对象属性即可。