Используйте модели Django в проекте Scrapy (в разработке)

Об этом уже спрашивали, но ответ, который всегда возникает, заключается в использовании DjangoItem. Однако на github указано, что:

часто не лучший выбор для приложений с интенсивной записью (таких как поисковый робот) ... может плохо масштабироваться

Это суть моей проблемы, я хотел бы использовать и взаимодействовать с моей моделью django так же, как я могу, когда я запускаю оболочку python manage.py и я выполните из myapp.models import Model1. Использование запросов как показано здесь.

Я пробовал относительный импорт и перемещал весь мой проект в приложение django, но безрезультатно.

Куда я должен переместить свой проект scrapy, чтобы это сработало? Как я могу воссоздать/использовать все методы, доступные мне в оболочке, внутри скрап-конвейера?

Заранее спасибо.


person Max Smith    schedule 28.01.2017    source источник
comment
Вы смогли в этом разобраться?   -  person Bipul Jain    schedule 30.01.2017
comment
Нет, у меня нет. Это сводит меня с ума. Я действительно хотел бы избежать работы с необработанным SQL. Django API отлично подходит для этого! Я мог бы изучить sqlalchemy, но я бы предпочел не изучать другую библиотеку, если у меня ее нет. Есть ли у вас какие-либо предложения или, возможно, подход, который я мог бы изучить?   -  person Max Smith    schedule 03.02.2017
comment
ОК, я сделал это раньше. Скоро напишу ответ. Это выходные.   -  person Bipul Jain    schedule 04.02.2017
comment
С нетерпением жду этого! Спасибо.   -  person Max Smith    schedule 07.02.2017


Ответы (1)


Здесь я создал пример проекта, который использует scrapy внутри django. И использует модели Django и ORM в одном из пайплайнов.

https://github.com/bipul21/scrapy_django

Структура каталогов начинается с вашего проекта django. В этом случае имя проекта — django_project. Оказавшись внутри базового проекта, вы создаете свой проект scrapy, т.е. scrapy_project здесь.

В настройках вашего проекта scrapy добавьте следующую строку для настройки инициализации django.

import os
import sys
import django

sys.path.append(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), ".."))
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings'

django.setup()

В конвейере я сделал простой запрос к модели вопросов.

from questions.models import Questions

class ScrapyProjectPipeline(object):
    def process_item(self, item, spider):
        try:
            question = Questions.objects.get(identifier=item["identifier"])
            print "Question already exist"
            return item
        except Questions.DoesNotExist:
            pass

        question = Questions()
        question.identifier = item["identifier"]
        question.title = item["title"]
        question.url = item["url"]
        question.save()
        return item

Вы можете проверить в проекте любые дополнительные сведения, такие как схема модели.

person Bipul Jain    schedule 07.02.2017
comment
Это именно то, что я искал! Спасибо большое. Не могу поверить, что не смог найти это в Интернете. - person Max Smith; 09.02.2017
comment
Итак, если это работает, в чем смысл плагина Scrapy-DjangoItem? Это кажется лучше, так как мне также нужно будет делать запросы к БД, чтобы правильно обновлять/сохранять очищенные элементы. - person Tjorriemorrie; 10.01.2018
comment
@Tjorriemorrie, вы нашли что-нибудь о плагине django-items? - person cikatomo; 27.10.2020