【问题标题】:How to import django models in scrapy pipelines.py file如何在 scrapy pipelines.py 文件中导入 django 模型
【发布时间】:2013-02-25 15:01:26
【问题描述】:

我正在尝试在我的 pipelines.py 中导入一个 django 应用程序的模型,以使用 django orm 保存数据。我在第一个涉及的django应用程序“app1”中创建了一个scrapy项目scrapy_project(顺便说一句,这是一个不错的选择吗?)。 我将这些行添加到我的 scrapy 设置文件中:

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)

current_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
setup_django_env(os.path.join(current_dir, '../../d_project1'))

当我尝试导入我的 django 应用程序 app1 的模型时,我收到以下错误消息:

Traceback (most recent call last):
  File "/usr/local/bin/scrapy", line 4, in <module>
    execute()
  File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 122, in execute
    _run_print_help(parser, _run_command, cmd, args, opts)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 76, in     _run_print_help
    func(*a, **kw)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py", line 129, in     _run_command
    cmd.run(args, opts)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/commands/crawl.py", line 43, in     run
    spider = self.crawler.spiders.create(spname, **opts.spargs)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/command.py", line 33, in crawler
    self._crawler.configure()
  File "/usr/local/lib/python2.7/dist-packages/scrapy/crawler.py", line 41, in configure
    self.engine = ExecutionEngine(self, self._spider_closed)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/core/engine.py", line 63, in     __init__
    self.scraper = Scraper(crawler)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/core/scraper.py", line 66, in     __init__
    self.itemproc = itemproc_cls.from_crawler(crawler)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/middleware.py", line 50, in     from_crawler
    return cls.from_settings(crawler.settings, crawler)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/middleware.py", line 29, in     from_settings
    mwcls = load_object(clspath)
  File "/usr/local/lib/python2.7/dist-packages/scrapy/utils/misc.py", line 39, in     load_object
    raise ImportError, "Error loading object '%s': %s" % (path, e)
ImportError: Error loading object 'scrapy_project.pipelines.storage.storage': No module         named dydict.models

为什么 scrapy 不能访问 django 应用程序模型(假设 app1 在 installed_app 中)?

【问题讨论】:

  • 只需要获取正确的路径,就可以访问模型了
  • 什么意思?你在谈论 setup_django_env 吗?如果是这样,唯一允许的路径是设置文件所在的 django 项目目录。在我的管道中,我应该像我猜的那样导入模型:form app1 import models。对吗?
  • 从 app1.models 导入......
  • 这正是我所做的:),为什么它不将 dydict 识别为应用程序?或者为什么看不到 dydict?
  • 您是否在已安装的应用程序中安装了它?放示例代码

标签: python django models scrapy


【解决方案1】:

在不导入 django 模型的管道中,您使用绑定到 django 模型的 scrapy 模型。 您必须在 scrapy 设置中添加 Django 设置,而不是之后。

要在 scrapy 项目中使用 django 模型,您必须使用 django_Item https://github.com/scrapy-plugins/scrapy-djangoitem(导入到你的pythonpath)

我推荐的文件结构是:

Projects
 |-DjangoScrapy
     |-DjangoProject
     |     |-Djangoproject
     |     |-DjangoAPP
     |-ScrapyProject
            |-ScrapyProject
                 |-Spiders

然后在您的 scrapy 项目中,您必须将 pythonpath ull 路径添加到 django 项目

**# Setting up django's project full path.**
import sys
sys.path.insert(0, '/home/PycharmProject/scrap/DjangoProject')

# Setting up django's settings module name.
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'DjangoProject.settings'

然后在您的 items.py 中,您可以将 Django 模型绑定到 scrapy 模型:

from DjangoProject.models import Person, Job
from scrapy_djangoitem import DjangoItem

class Person(DjangoItem):
    django_model = Person
class Job(DjangoItem):
    django_model = Job

然后你可以在yeld对象之后在管道中使用.save()方法:

spider.py

from scrapy.spider import BaseSpider
from mybot.items import PersonItem

class ExampleSpider(BaseSpider):
    name = "example"
    allowed_domains = ["dmoz.org"]
    start_urls = ['http://www.dmoz.org/World/Espa%C3%B1ol/Artes/Artesan%C3%ADa/']

    def parse(self, response):
        # do stuff
        return PersonItem(name='zartch')

pipelines.py

from myapp.models import Person

class MybotPipeline(object):
    def process_item(self, item, spider):
        obj = Person.objects.get_or_create(name=item['name'])
        return obj

我有一个代码最少的存储库:(您只需在 scrapy 设置中设置 django 项目的路径) https://github.com/Zartch/Scrapy-Django-Minimal

在: https://github.com/Zartch/Scrapy-Django-Minimal/blob/master/mybot/mybot/settings.py 您必须将我的 Django Project 路径更改为您的 DjangoProject 路径:

sys.path.insert(0, '/home/zartch/PycharmProjects/Scrapy-Django-Minimal/myweb')

【讨论】:

    【解决方案2】:

    试试:

    from .. models import MyModel 
    

    from ... models import MyModel
    

    每个点代表位置

    【讨论】:

    • 这真的很奇怪,我不明白。为什么这么难!!不行,我只能导入django项目目录下的models文件。我什至在与 django 应用程序相同级别的 Hierarchical 上创建了一个 scrapy 项目,但我无法导入我的应用程序模型。
    • 因为你把scrapy项目放在dydict app里面
    • 我什至在与 django 应用程序相同的 Hierarchical 级别上创建了一个 scrapy 项目,但我无法导入我的应用程序模型(同上:'()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多