【问题标题】:Access django models inside of Scrapy在 Scrapy 中访问 django 模型
【发布时间】:2011-05-15 09:24:40
【问题描述】:

是否可以在 Scrapy 管道中访问我的 django 模型,以便我可以将抓取的数据直接保存到我的模型中?

我见过this,但我真的不知道如何设置?

【问题讨论】:

  • 这并不是我真正想要的,因为我已经在使用 django。我不想只使用 ORM。我也不想维护单独的设置文件。
  • 你想使用 Django 的一部分:ORM。这是一个常见的问题。请搜索。该问题中引用的 Django 站点具有单独使用 ORM 的特定方法,无需额外设置。请实际阅读问题、答案并点击链接。这是一个常见的问题。已经回答了。
  • 抱歉 S. Lott,这不是同一个问题。

标签: python django django-models scrapy


【解决方案1】:

解决 KeyError 的小更新。 Python(3)/Django(1.10)/Scrapy(1.2.0)

from django.core.management.base import BaseCommand

class Command(BaseCommand):    
    help = 'Scrapy commands. Accessible from: "Django manage.py". '

    def __init__(self, stdout=None, stderr=None, no_color=False):
        super().__init__(stdout=None, stderr=None, no_color=False)

        # Optional attribute declaration.
        self.no_color = no_color
        self.stderr = stderr
        self.stdout = stdout

        # Actual declaration of CLI command
        self._argv = None

    def run_from_argv(self, argv):
        self._argv = argv
        self.execute(stdout=None, stderr=None, no_color=False)

    def handle(self, *args, **options):
        from scrapy.cmdline import execute
        execute(self._argv[1:])

仍然需要 SCRAPY_SETTINGS_MODULE 声明。

os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'scrapy_project.settings')

【讨论】:

    【解决方案2】:

    setup-environ 已弃用。对于较新版本的 django 1.4+,您可能需要在 scrapy 的设置文件中执行以下操作

    def setup_django_env():
        import sys, os, django
    
        sys.path.append('/path/to/django/myapp')
        os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
    
    django.setup()
    

    【讨论】:

      【解决方案3】:

      为什么不在scrapy项目文件夹中创建一个__init__.py文件并将其挂接到INSTALLED_APPS?为我工作。我能够简单地使用:

      piplines.py

      from my_app.models import MyModel
      

      希望对您有所帮助。

      【讨论】:

      • 您是在建议您尚未实际使用或测试过的解决方案吗?
      • “为我工作”是我的说法,我在我的一个项目中使用并测试了它。
      【解决方案4】:

      查看 django-dynamic-scraper,它将 Scrapy 蜘蛛管理器集成到 Django 站点中。

      https://github.com/holgerd77/django-dynamic-scraper

      【讨论】:

        【解决方案5】:

        在你的scrapy项目的settings.py中添加DJANGO_SETTINGS_MODULE env

        import os
        os.environ['DJANGO_SETTINGS_MODULE'] = 'your_django_project.settings'
        

        现在您可以在您的 scrapy 项目中使用 DjangoItem。

        编辑:
        您必须确保your_django_project 项目settings.pyPYTHONPATH 中可用。

        【讨论】:

          【解决方案6】:

          对于 Django 1.4,项目布局已更改。设置模块位于 /myproject/myproject/settings.py 中,而不是 /myproject/settings.py。

          我还将路径的父目录 (/myproject) 添加到 sys.path 以使其正常工作。

          def setup_django_env(path):
              import imp, os, sys
              from django.core.management import setup_environ
          
              f, filename, desc = imp.find_module('settings', [path])
              project = imp.load_module('settings', f, filename, desc)       
          
              setup_environ(project)
          
              # Add path's parent directory to sys.path
              sys.path.append(os.path.abspath(os.path.join(path, os.path.pardir)))
          
          setup_django_env('/path/to/django/myproject/myproject/')
          

          【讨论】:

          • 注意setup_environ的用法是deprecated从1.4版本开始。
          【解决方案7】:

          相反的解决方案(在 django 管理命令中设置 scrapy):

          # -*- coding: utf-8 -*-
          # myapp/management/commands/scrapy.py 
          
          from __future__ import absolute_import
          from django.core.management.base import BaseCommand
          
          class Command(BaseCommand):
          
              def run_from_argv(self, argv):
                  self._argv = argv
                  self.execute()
          
              def handle(self, *args, **options):
                  from scrapy.cmdline import execute
                  execute(self._argv[1:])
          

          在 django 的 settings.py 中:

          import os
          os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_project.settings'
          

          然后运行./manage.py scrapy foo,而不是scrapy foo

          UPD:修复代码以绕过 django 的选项解析。

          【讨论】:

          • @Mikhail:我刚刚意识到我无法执行 Scrapy 的命令行选项,例如 -o scraped_data.json -t json。我知道如何为命令添加选项,但是如何将它们链接到 Scrapy 的对应项?
          • @Peter:请尝试更新后的示例。它应该将选项传递给scrapy,而不是尝试将它们作为django的选项来处理。
          • 谢谢——基本上就是这样。我得到了这个工作:myapp.management.commands.scrapy.Command().run_from_argv(['scrapy','','crawl','dmoz'])
          • 在进入这个非常深的兔子洞之后,我最终放弃了这种方法,原因有很多,例如 1)无法重新启动扭曲,这意味着只有第一个命令可以工作,所以尝试从多个用户发起的操作触发是不可能的。 2)不得不重新编写一大堆scrapy来解决twisted假设它是从主线程开始的问题。所以我建议你改用 scrapyd 并作为 web 服务调用。
          • 你不需要绕过选项解析。您只需要一个 POSIX 样式的分隔符。请参阅 my answer 到 Peter Stahl 的问题。
          【解决方案8】:

          如果其他人遇到同样的问题,我就是这样解决的。

          我将此添加到我的 scrapy settings.py 文件中:

          def setup_django_env(path):
              import imp, os
              from django.core.management import setup_environ
          
              f, filename, desc = imp.find_module('settings', [path])
              project = imp.load_module('settings', f, filename, desc)       
          
              setup_environ(project)
          
          setup_django_env('/path/to/django/project/')
          

          注意:上面的路径是你的 django 项目文件夹,而不是 settings.py 文件。

          现在您可以在您的 scrapy 项目中完全访问您的 django 模型。

          【讨论】:

          • 这是一个包含 pipeline.py 代码的相关答案:stackoverflow.com/questions/7883196/…
          • 只是一个小笔记。使用 Django 1.4 中的新项目布局,路径应为 setup_django_env('/path/to/django/project/project/')
          • 这个解决方案对我来说非常有用,直到我尝试使用 scrapyd 进行部署。当scrapyd自动构建egg时,似乎缺少包中的Django代码。我明白了: Deploying my_scraper-1354463004 to localhost:6800/addversion.json Server response (200): {"status": "error", "message": "ImportError: No module named settings"} - 任何建议如何处理?似乎如果我可以将 Django 代码放入鸡蛋中,我会没事的,但我不太清楚如何做到这一点。
          • 我正在尝试使用您的解决方案,但它给了我一个Import Error。您是否愿意查看我的 [问题] (stackoverflow.com/questions/14686223/…) 并提供建议?
          • 在当前的 django 版本中 from django.core.management import setup_environ 将不起作用...那么如何做到这一点
          猜你喜欢
          • 1970-01-01
          • 2013-10-04
          • 2019-03-26
          • 2013-10-15
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多