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



这之前已经问过了,但总是出现的答案是使用DjangoItem。然而,它在它的github上指出:

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

这是我问题的症结所在,我想使用我的 django 模型并与之交互,就像我在运行 python manage.py shell 时一样,我从 myapp.models 导入 Model1。使用如下所示的查询。

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

我应该将我的抓取项目移动到哪里才能正常工作?如何在刮擦管道内的 shell 中重新创建/使用所有可用的方法?

提前谢谢。

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

https://github.com/bipul21/scrapy_django

目录结构从你的 django 项目开始。在本例中,项目名称为 django_project。进入基本项目后,您可以创建您的抓取项目,即scrapy_project 这里

在你的抓取项目设置中添加以下行来设置初始化 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

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

最新更新