从Django Project中的Scrapy获取蜘蛛列表

时间:2020-06-30 10:48:45

标签: python django scrapy

我正在按照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'] 返回一个空列表

2 个答案:

答案 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()

因此在我的解决方案中,我只需要重新分配/替换设置对象属性即可。