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

Max*_*ith 1 python django django-models scrapy scrapy-pipeline

之前曾有人问过这个问题,但总会出现的答案是使用DjangoItem。但是它在github上指出:

通常对于写密集型应用程序(例如Web爬网程序)来说不是一个好的选择...可能无法很好地扩展

这是我问题的症结所在,我想以与我运行python manage.py shell以及从myapp.models import Model1进行操作时相同的方式使用Django模型并与之交互。使用查询如此处所示。

我已经尝试了相对导入,并将我的整个scrapy项目移到了django应用程序中,但都无济于事。

我应该将我的拼凑项目移到哪里进行这项工作?我该如何重新创建/使用所有在Scrapy管道内的Shell中可用的方法?

提前致谢。

Bip*_*ain 5

在这里,我创建了一个示例项目,该项目在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()
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

您可以在项目中签入任何更多详细信息,例如模型架构。