在Scrapy项目中使用Django的模型(在管道中)

时间:2017-01-28 01:19:48

标签: python django django-models scrapy scrapy-pipeline

以前曾经问过,但总是出现的答案是使用DjangoItem。然而,它在github上声明:

  

通常不是写密集型应用程序(例如网络爬虫)的好选择...可能无法很好地扩展

这是我的问题的症结所在,我想以与运行 python manage.py shell 我从myapp.models导入Model1 。使用查询like seen here.

我尝试过相对导入并在我的django应用程序中移动我的整个scrapy项目,但都无济于事。

我应该在哪里移动我的scrapy项目来实现这个目的?如何在scrapy管道中重新创建/使用shell中可用的所有方法?

提前致谢。

1 个答案:

答案 0 :(得分:4)

在这里,我创建了一个在django中使用scrapy的示例项目。并在其中一个管道中使用Django模型和ORM。

https://github.com/bipul21/scrapy_django

目录结构以您的django项目开始。 在这种情况下,项目名称为 django_project 。 进入基础项目后,您可以创建scrapy项目,即 scrapy_project 此处

在scrapy项目设置中,添加以下行以设置初始化django

import os
import sys
import django

sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), ".."))
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings'

django.setup()

在管道中,我对问题模型进行了简单的查询

from questions.models import Questions

class ScrapyProjectPipeline(object):
    def process_item(self, item, spider):
        try:
            question = Questions.objects.get(identifier=item["identifier"])
            print "Question already exist"
            return item
        except Questions.DoesNotExist:
            pass

        question = Questions()
        question.identifier = item["identifier"]
        question.title = item["title"]
        question.url = item["url"]
        question.save()
        return item

您可以在项目中查看模型架构等更多详细信息。