الوصول إلى نماذج Django داخل Scrapy
-
28-09-2019 - |
سؤال
هل من الممكن الوصول إلى نماذج 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.
لماذا لا تنشئ __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')