发布于 2015-09-04 06:51:28 | 261 次阅读 | 评论: 0 | 来源: 网络整理
DjangoItem
是一个item的类,其从Django模型中获取字段(field)定义。
您可以简单地创建一个 DjangoItem
并指定其关联的Django模型。
除了获得您item中定义的字段外, DjangoItem
提供了创建并获得一个具有item数据的Django模型实例(Django model instance)的方法。
DjangoItem
使用方法与Django中的ModelForms类似。您创建一个子类,
并定义其 django_model
属性。这样,您就可以得到一个字段与Django模型字段(model field)一一对应的item了。
另外,您可以定义模型中没有的字段,甚至是覆盖模型中已经定义的字段。
让我们来看个例子:
创造一个Django模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=255)
age = models.IntegerField()
定义一个基本的 DjangoItem
:
from scrapy.contrib.djangoitem import DjangoItem
class PersonItem(DjangoItem):
django_model = Person
DjangoItem
的使用方法和 Item
类似:
>>> p = PersonItem()
>>> p['name'] = 'John'
>>> p['age'] = '22'
要从item中获取Django模型,调用 DjangoItem
中额外的方法 save()
:
>>> person = p.save()
>>> person.name
'John'
>>> person.age
'22'
>>> person.id
1
当我们调用 save()
时,模型已经保存了。我们可以在调用时带上 commit=False
来避免保存,
并获取到一个未保存的模型:
>>> person = p.save(commit=False)
>>> person.name
'John'
>>> person.age
'22'
>>> person.id
None
正如之前所说的,我们可以在item中加入字段:
import scrapy
from scrapy.contrib.djangoitem import DjangoItem
class PersonItem(DjangoItem):
django_model = Person
sex = scrapy.Field()
>>> p = PersonItem()
>>> p['name'] = 'John'
>>> p['age'] = '22'
>>> p['sex'] = 'M'
注解
当执行 save()
时添加到item的字段不会有作用(taken into account)。
并且我们可以覆盖模型中的字段:
class PersonItem(DjangoItem):
django_model = Person
name = scrapy.Field(default='No Name')
这在提供字段属性时十分有用,例如您项目中使用的默认或者其他属性一样。
DjangoItem提供了在Scrapy项目中集成DjangoItem的简便方法,不过需要注意的是, 如果在Scrapy中爬取大量(百万级)的item时,Django ORM扩展得并不是很好(not scale well)。 这是因为关系型后端对于一个密集型(intensive)应用(例如web爬虫)并不是一个很好的选择, 尤其是具有大量的索引的数据库。
在Django应用之外使用Django模型(model),您需要设置
DJANGO_SETTINGS_MODULE
环境变量以及 –大多数情况下– 修改
PYTHONPATH
环境变量来导入设置模块。
完成这个配置有很多方法,具体选择取决您的情况及偏好。 下面详细给出了完成这个配置的最简单方法。
假设您项目的名称为 mysite
,位于
/home/projects/mysite
且用 Person
模型创建了一个应用 myapp
。
这意味着您的目录结构类似于:
/home/projects/mysite
├── manage.py
├── myapp
│ ├── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
接着您需要将 /home/projects/mysite
加入到 PYTHONPATH
环境变量中并将 mysite.settings
设置为 DJANGO_SETTINGS_MODULE
环境变量。
这可以在Scrapy设置文件中添加下列代码:
import sys
sys.path.append('/home/projects/mysite')
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
注意,由于我们在python运行环境中,所以我们修改 sys.path
变量而不是 PYTHONPATH
环境变量。
如果所有设置正确,您应该可以运行 scrapy shell
命令并且导入 Person
模型(例如 from myapp.models import Person
)。