سؤال

هل من الممكن الوصول إلى نماذج Django الخاصة بي داخل خط أنابيب Scrapy ، حتى أتمكن من حفظ بياناتي المكثفة مباشرة إلى النموذج الخاص بي؟

رأيت هذه, ، لكنني لا أحصل على كيفية إعداده؟

هل كانت مفيدة؟

المحلول

إذا كان أي شخص آخر يعاني من نفس المشكلة ، فهذه هي الطريقة التي حللت بها.

أضفت هذا إلى بلدي 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 الخاص بك ، وليس ملف الإعدادات.

الآن سيكون لديك وصول كامل إلى نماذج Django الخاصة بك داخل مشروع Scrapy الخاص بك.

نصائح أخرى

الحل المعاكس (إعداد Scrapy في أمر إدارة Django):

# -*- 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.py:

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

ثم بدلا من scrapy foo يجري ./manage.py scrapy foo.

UPD: إصلاح الرمز لتجاوز تحليل خيارات Django.

أضف django_settings_module env في إعدادات مشروع Scrapy الخاص بك

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

الآن يمكنك استخدام Djangoitem في مشروع Scrapy الخاص بك.

يحرر:
عليك أن تتأكد من أن your_django_project المشاريع settings.py متوفر في PYTHONPATH.

بالنسبة إلى Django 1.4 ، تغير تخطيط المشروع. بدلاً من /myproject/settings.py ، تكون وحدة الإعدادات في /myproject/myproject/settings.py.

أضفت أيضًا دليل الوالدين لـ Path (/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/')

تحقق من Django-Dynamic-Scraper ، فهو يدمج مدير العنكبوت Scrapy في موقع Django.

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

لماذا لا تنشئ __init__.py ملف في مجلد مشروع SCRAPY وربطه في INSTALLED_APPS؟ عملت بالنسبة لي. كنت قادرا على الاستخدام ببساطة:

piplines.py

from my_app.models import MyModel

امل ان يساعد.

setup-environ تم إهماله. قد تحتاج إلى القيام بما يلي في ملف إعدادات Scrapy للحصول على إصدارات أحدث من Django 1.4+

def setup_django_env():
    import sys, os, django

    sys.path.append('/path/to/django/myapp')
    os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

django.setup()

تحديث بسيط لحل 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')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top