Home > Enterprise >  how to send data from scrapy data to a django model?
how to send data from scrapy data to a django model?

Time:11-28

Is it possible to create new products using scrapy in django ?

Whenever I run scrapy.py I get the following error:

raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

my app models file

from django.db import models

# Create your models here.

class Product(models.Model):
    name = models.CharField(max_length=50)
    age =  models.IntegerField()
    content =  models.TextField(max_length=400)
    def __str__(self):
        return self.name

scrapy.py file

from models import Product

Product.objects.create(name='BMW', age=25, content='cool car')

CodePudding user response:

Yes of course it's possible, you just to import django and configure the DJANGO_SETTINGS_MODULE variable :

import django
import os

# Configure settings for project
# Need to run this before calling models from application!
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app_name.settings') # Replace app_name with your application name.

# Import settings
django.setup()

# Import the models now
from app_name.models import Product

# Use the imported model
product = Product.objects.create(...)

More infos on this post

CodePudding user response:

For the error you are having above you might be setting up Django incorrectly.

Therefore, this question have two problems to be solved:

  1. Django environment not properly setup.
  2. Send data to model from a crawled data.

**1. Fix Django Setup issue **

For the first question I advise you to setup Django normally creating a project.... Then, create an app as python manage.py startapp product_app ADD the product_app into settings.INSTALLED_APPS as:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'product_app' <----- without this the models.py won't work.
]

Then, go to your models.py and create the model Product for example. Migrate the model into your database.

Alright your first question might be answered.

2. Add crawled data into a Django model.

The second part is send data to the product table using the Product model (the representation of the product table).

The fields you will create will depend on the data you need. Let say, the data I want to store from the crawled data are: name, description, price, stock and if it is available.

Great, lets create our model:

product_app/

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=250, unique=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.IntegerField(default =0)
    available = models.BooleanField(default=True)

    class Meta:
        verbose_name = 'product'
        verbose_name_plural =  'products'

    def __str__(self):
        return str(self.name)

Since Django accepts dictionaries as objects to be used for queries you can get this crawled data into a dictionary/json for after be pushed into the Product table.

Alright, now for your part you will need to somehow get the data as dictionary as similar this and push into the Product table:

data = {
    "name":"bmw", 
    "description":"dont waste your money", 
    "price":25000.00, 
    "stock":4, 
    "available":True
    }

query example:

Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
>>> from product_app.models import Product
>>> 
>>> data = {"name":"bmw", "description":"dont waste your money", "price":25000.00, "stock":4, "available":True,}
>>> 
>>> product = Product(**data)
>>> product.save()
>>> 
>>> product
<Product: bmw>

From here you can do whatever you want with the data. Install Django-Rest-Framework and display the data as an REST-API or display the data in a template.

Bear in mind that you can create the queries needed into views.py or wherever you want.

  • Related