访问Django模型:定义Django项目的路径

我是Python和Django的新手。我目前正在探索使用Scrapy抓取网站并将数据保存到Django数据库。我的目标是根据用户提供的域来运行蜘蛛。

我写了一个Spider来提取我需要的数据,并在调用时将其正确存储在json文件中

scrapy crawl spider -o items.json -t json

我现在的目标是使Spider成功地将数据保存到Django数据库,然后根据用户输入来使Spider运行。

我知道与此主题相关的各种帖子,

但是,花了超过8个小时的时间试图使它工作,我假设我不是唯一仍然面临此问题的人。为此,我将尝试收集到目前为止我在本文中获得的所有知识,并希望在以后发布可行的解决方案。因此,这篇文章相当长。

在我看来,有两种不同的解决方案可以将数据从Scrapy保存到Django数据库。一种是使用DjangoItem,另一种是直接导入模型。

我还没有完全意识到这两个优点和缺点,但是似乎区别只是使用DjangoItem更方便,更短。

我做了什么:

我已经添加:

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('/Users/Anders/DjangoTraining/wsgi/')

我得到的错误是:

ImportError: No module named settings

我以为我以错误的方式定义了我的Django项目的路径?

我还尝试了以下方法:

setup_django_env('../../') 

如何正确定义Django项目的路径?(如果那是问题)

回答:

我认为主要的误解是软件包路径与设置模块路径。为了从外部脚本使用django的模型,你需要设置DJANGO_SETTINGS_MODULE。然后,该模块必须是可导入的(即,如果设置路径为myproject.settings,则该语句from myproject import settings应在python shell中运行)。

由于django中的大多数项目都是在default之外的路径中创建的PYTHONPATH,因此必须将项目的路径添加到PYTHONPATH环境变量中。

这是一个分步指南,用于将完全正常(且最少)的Django模型集成到Scrapy项目中:

注意:本说明在上次编辑日期生效。如果对你不起作用,请添加评论并描述你的问题以及scrapy / django版本。

  1. 项目将在/home/rolando/projects目录中创建。

  2. 启动django项目。

$ cd ~/projects

$ django-admin startproject myweb

$ cd myweb

$ ./manage.py startapp myapp

  1. 在中创建模型myapp/models.py。

from django.db import models

class Person(models.Model):

name = models.CharField(max_length=32)

  1. 添加myapp到INSTALLED_APPS中myweb/settings.py。

# at the end of settings.py

INSTALLED_APPS += ('myapp',)

  1. 在中设置我的数据库设置myweb/settings.py。

# at the end of settings.py

DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'

DATABASES['default']['NAME'] = '/tmp/myweb.db'

  1. 创建数据库。

$ ./manage.py syncdb --noinput

Creating tables ...

Installing custom SQL ...

Installing indexes ...

Installed 0 object(s) from 0 fixture(s)

  1. 创建scrapy项目。

$ cd ~/projects

$ scrapy startproject mybot

$ cd mybot

  1. 在中创建一个项目mybot/items.py

注意:在较新版本的Scrapy中,你需要安装scrapy_djangoitem和使用from scrapy_djangoitem import DjangoItem

    from scrapy.contrib.djangoitem import DjangoItem

from scrapy.item import Field

from myapp.models import Person

class PersonItem(DjangoItem):

# fields for this item are automatically created from the django model

django_model = Person

最终的目录结构是这样的:

/home/rolando/projects

├── mybot

│ ├── mybot

│ │ ├── __init__.py

│ │ ├── items.py

│ │ ├── pipelines.py

│ │ ├── settings.py

│ │ └── spiders

│ │ └── __init__.py

│ └── scrapy.cfg

└── myweb

├── manage.py

├── myapp

│ ├── __init__.py

│ ├── models.py

│ ├── tests.py

│ └── views.py

└── myweb

├── __init__.py

├── settings.py

├── urls.py

└── wsgi.py

从这里开始,基本上我们已经完成了在scrapy项目中使用django模型所需的代码。我们可以使用scrapy shell命令立即对其进行测试,但是请注意所需的环境变量:

$ cd ~/projects/mybot

$ PYTHONPATH=~/projects/myweb DJANGO_SETTINGS_MODULE=myweb.settings scrapy shell

# ... scrapy banner, debug messages, python banner, etc.

In [1]: from mybot.items import PersonItem

In [2]: i = PersonItem(name='rolando')

In [3]: i.save()

Out[3]: <Person: Person object>

In [4]: PersonItem.django_model.objects.get(name='rolando')

Out[4]: <Person: Person object>

因此,它按预期工作。

最后,你可能不需要每次运行机器人时都必须设置环境变量。尽管最好的办法是将项目的程序包实际安装在中设置的路径中,但有许多替代方法可以解决此问题PYTHONPATH。

这是最简单的解决方案之一:将这些行添加到mybot/settings.py文件中以设置环境变量。

# Setting up django's project full path.

import sys

sys.path.insert(0, '/home/rolando/projects/myweb')

# Setting up django's settings module name.

# This module is located at /home/rolando/projects/myweb/myweb/settings.py.

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'myweb.settings'

# Since Django 1.7, setup() call is required to populate the apps registry.

import django; django.setup()

注意:更好的方法是在两个项目中都有setuptools基于setup.py文件的文件,然后运行python setup.py develop它们,这会将你的项目路径链接到python的路径(我假设你使用virtualenv)。

足够了。为了完整起见,这是一个可以正常运行的项目的基本工具和管道:

1.Create the spider.

$ cd ~/projects/mybot

$ scrapy genspider -t basic example example.com

The spider code:

# file: mybot/spiders/example.py

from scrapy.spider import BaseSpider

from mybot.items import PersonItem

class ExampleSpider(BaseSpider):

name = "example"

allowed_domains = ["example.com"]

start_urls = ['http://www.example.com/']

def parse(self, response):

# do stuff

return PersonItem(name='rolando')

2.创建一个管道mybot/pipelines.py以保存该项目。

class MybotPipeline(object):

def process_item(self, item, spider):

item.save()

return item

item.save()如果你使用的是DjangoItem类,则可以在这里使用,也可以直接导入django模型并手动创建对象。在这两种方式中,主要问题是定义环境变量,以便可以使用django模型。

3.将管道设置添加到你的mybot/settings.py文件。

ITEM_PIPELINES = {

'mybot.pipelines.MybotPipeline': 1000,

}

4.Run the spider.

$ scrapy crawl example

以上是 访问Django模型:定义Django项目的路径 的全部内容, 来源链接: utcz.com/qa/425376.html

回到顶部