我认为主要的误解是软件包路径与设置模块路径。为了从外部脚本使用django的模型,您需要设置
DJANGO_SETTINGS_MODULE。然后,该模块必须是
可导入的 (即,如果设置路径为
myproject.settings,则该语句
from myproject importsettings应在python shell中运行)。
由于django中的大多数项目都是在default之外的路径中创建的
PYTHONPATH,因此必须将项目的路径添加到
PYTHONPATH环境变量中。
这是一个分步指南,用于将完全正常(且最少)的Django模型集成到Scrapy项目中:
注意: 本说明在上次编辑日期生效。如果对您不起作用,请添加评论并描述您的问题以及scrapy / django版本。
项目将在
/home/rolando/projects
目录中创建。启动 django项目 。
$ cd ~/projects
$ django-admin startproject myweb
$ cd myweb
$ ./manage.py startapp myapp在中创建模型
myapp/models.py
。from django.db import models
class Person(models.Model):
name = models.CharField(max_length=32)添加
myapp
到INSTALLED_APPS
中myweb/settings.py
。# at the end of settings.py
INSTALLED_APPS += (‘myapp’,)
在中设置我的数据库设置
myweb/settings.py
。# at the end of settings.py
DATAbaseS[‘default’][‘ENGINE’] = ‘django.db.backends.sqlite3’
DATAbaseS[‘default’][‘NAME’] = ‘/tmp/myweb.db’创建数据库。
$ ./manage.py syncdb --noinput
Creating tables …
Installing custom SQL …
Installing indexes …
Installed 0 object(s) from 0 fixture(s)创建 scrapy项目 。
$ cd ~/projects
$ scrapy startproject mybot
$ cd mybot在中创建一个项目
mybot/items.py
。
注意: 在较新版本的Scrapy中,您需要安装
scrapy_djangoitem和使用
from scrapy_djangoitemimport 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
从这里开始,基本上我们已经完成了在一个沙哑的项目中使用django模型所需的代码。我们可以使用
scrapyshell命令立即对其进行测试,但是请注意所需的环境变量:
$ 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 PersonItemIn [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 syssys.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 osos.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.pydevelop,这些文件会将您的项目路径链接到python的路径中(我假设您使用
virtualenv)。
足够了。为了完整起见,这是一个可以正常工作的项目的基本介绍和管道:
- 创建蜘蛛。
$ cd ~/projects/mybot
$ scrapy genspider -t basic example example.com
蜘蛛代码:
# file: mybot/spiders/example.pyfrom scrapy.spider import baseSpiderfrom mybot.items import PersonItemclass ExampleSpider(baseSpider): name = "example" allowed_domains = ["example.com"] start_urls = ['http://www.example.com/'] def parse(self, response): # do stuff return PersonItem(name='rolando')
- 创建一个管道
mybot/pipelines.py
以保存该项目。class MybotPipeline(object):def process_item(self, item, spider): item.save() return item
item.save()如果您使用的是
DjangoItem类,则可以在这里使用,也可以直接导入django模型并手动创建对象。两种方式的主要问题是定义环境变量,以便您可以使用django模型。
将管道设置添加到您的
mybot/settings.py
文件。ITEM_PIPELINES = {'mybot.pipelines.MybotPipeline': 1000,}
跑蜘蛛。
$ scrapy crawl example



