2011-10-24 8 views
8

저는 Scrapy 프로젝트를 가지고 있고 Django 모델 정의 (DjangoItem을 사용하지 않고 있습니다)에서 출력 항목을 오브젝트로 저장하려고합니다.Scrapy 프로젝트에서 Django 모델을 저장합니다.

here으로 장고 설정을 가져오고 있습니다.

from my_django_project.apps.my_books.models import Book, Category, Image 

class DjangoPipeline(object): 

    def process_item(self, item, spider): 
     category = Category.objects.get(name='Horror') 
     book = Book(name='something', category=category) 
     book.save() 
     image = Image(name='something', book=book) 
     image.save() 
     return item 

하지만, 뭔가 이상한 일이 내가 얻을 첫 번째 항목에 대한 내 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) 

setup_django_env(PATH_TO_DJANGO_PROJECT) 

나는 끝에 모든 항목을 처리하고 DB에 저장 파이프 라인 클래스가 오류 (아래 참조). 나머지 항목은 모두 정상입니다. 저장하려는 항목이 7 개라고 가정 해 봅시다. 처음에는 오류가 발생하고 다른 하나는 저장됩니다. 나는 이런 식으로 뭔가를 할 경우

Traceback (most recent call last): 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/scrapy/middleware.py", line 54, in _process_chain 
    return process_chain(self.methods[methodname], obj, *args) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/scrapy/utils/defer.py", line 65, in process_chain 
    d.callback(input) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/internet/defer.py", line 243, in callback 
    self._startRunCallbacks(result) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/internet/defer.py", line 312, in _startRunCallbacks 
    self._runCallbacks() 
--- <exception caught here> --- 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/internet/defer.py", line 328, in _runCallbacks 
    self.result = callback(self.result, *args, **kw) 
    File "https://stackoverflow.com/users/ale/djcode/books/lib/scraper/scraper/djangopipeline.py", line 34, in process_item 
    selected_category = Category.objects.get(name='Horror') 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/manager.py", line 132, in get 
    return self.get_query_set().get(*args, **kwargs) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/query.py", line 333, in get 
    clone = self.filter(*args, **kwargs) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/query.py", line 550, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude 
    clone.query.add_q(Q(*args, **kwargs)) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1131, in add_q 
    can_reuse=used_aliases) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1026, in add_filter 
    negate=negate, process_extras=process_extras) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1182, in setup_joins 
    field, model, direct, m2m = opts.get_field_by_name(name) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 291, in get_field_by_name 
    cache = self.init_name_map() 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 321, in init_name_map 
    for f, model in self.get_all_related_m2m_objects_with_model(): 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 396, in get_all_related_m2m_objects_with_model 
    cache = self._fill_related_many_to_many_cache() 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/options.py", line 410, in _fill_related_many_to_many_cache 
    for klass in get_models(): 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/loading.py", line 167, in get_models 
    self._populate() 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/loading.py", line 61, in _populate 
    self.load_app(app_name, True) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/db/models/loading.py", line 76, in load_app 
    app_module = import_module(app_name) 
    File "https://stackoverflow.com/users/ale/virtualenvs/books/lib/python2.6/site-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
exceptions.ImportError: No module named my_books 

은 모두 7 개 항목이 저장 얻을 :

from my_django_project.apps.my_app.models import Book, Category, Image 

class DjangoPipeline(object): 

    def process_item(self, item, spider): 
     try: 
      category = Category.objects.get(name='something') 
     except: 
      category = Category.objects.get(name='something') 
     book = Book(name='something', category=category) 
     try: 
      book.save() 
     except: 
      book.save() 
     image = Image(name='something', book=book) 
     try: 
      image.save() 
     except: 
      image.save() 
     return item 

나는 내가 뭘 잘못 알고하지 않습니다. 누군가 날 도와 줄 수 있니?

감사합니다.

+0

my_django_project를 참조 할 때 실제로 해당 참조를 참조하거나 mysite.apps import *와 같은 프로젝트 이름으로 바꾸십시오. – emschorsch

+0

나는 그 프로젝트를 내 프로젝트의 이름으로 바꾸고있다 :) – Alex

+0

안녕하세요, 알렉스, 당신이 한 일을하고 문제를 일으키려고합니다. 당신이 내 생각에 당신이 이걸 알아 냈어 그래서 당신이 내 [질문] (http://stackoverflow.com/questions/14686223/scrapy-project-cant-find-django-core-management) 조언을 제공하십시오. 감사! – GChorn

답변

4

나는 동일한 문제가있어서 해결책을 찾았습니다. 적어도 그것은 나를 위해 일했습니다.

제 경우에는 Django 프로젝트의 settings.py 파일에 문제가 있습니다 - INSTALLED_APPS 튜플에 내 앱의 FQN (fully qualified name)을 추가하지 않았지만 짧은 이름입니다.

예를 들어, my_django_project.apps.my_books이 아닌 my_books 요소를 INSTALLED_APPS에 추가했을 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 그 코드를 가지고있는 즉시 그것을 시도 할 것이다. – Alex

0

나는 이상한 문제를 일으킬 수있는 __init__.py 파일이 누락 된 것을 기억합니다. 모든 모듈에이 패키지가 있습니까?

+0

예, 모든 모듈에 있습니다 :) – Alex

관련 문제