4

django ormを使用してデータを保存するために、pipelines.pyに1つのdjangoアプリケーションのモデルをインポートしようとしています。最初に関与した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

djangoアプリケーションモデルにスクレイプアクセスできないのはなぜですか(installed_appのapp1を指定)?

4

2 に答える 2

1

djangoモデルをインポートしないパイプラインでは、djangoモデルにバインドされたスクレイプモデルを使用します。Django設定は、後ではなく、スクレイプ設定で追加する必要があります。

Scrapyプロジェクトでdjangoモデルを使用するには、django_Item https://github.com/scrapy-plugins/scrapy-djangoitem(pythonpathにインポート)を使用する必要があります

私が推奨するファイル構造は次のとおりです。

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

次に、scrapyプロジェクトで、Pythonpathullパスを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モデルをスクレイプモデルにバインドできます。

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')

pipes.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

最小限のコードが機能するリポジトリがあります:(スクレイプ設定でdjangoプロジェクトのパスを設定する必要があります) https://github.com/Zartch/Scrapy-Django-Minimal

で: https : //github.com/Zartch/Scrapy-Django-Minimal/blob/master/mybot/mybot/settings.pyDjangoProjectのパスをDjangoProjectのパスに変更する必要があります。

sys.path.insert(0, '/home/zartch/PycharmProjects/Scrapy-Django-Minimal/myweb')
于 2015-12-01T18:29:05.127 に答える
0

試す:

from .. models import MyModel 

また

from ... models import MyModel

すべてのドットは場所を表します

于 2013-03-10T14:13:04.013 に答える