使用django模型编写刮削项的scrapy扩展
scrapy-djangoitem的Python项目详细描述
^ tt1}$是一个扩展,允许使用现有的{a5}定义Scrapy items。
此实用程序提供一个名为DjangoItem的新类,您可以将其用作 常规的scrapy项并将其链接到django模型及其django_model 属性。立即开始使用,方法是从这个包中导入:
from scrapy_djangoitem import DjangoItem
安装
从v1.1开始,Python 2.7和Python 3.4/3.5都是 支持。对于Python 3,您需要Scrapy v1.1或更高版本。
最新测试的django版本是Django 1.9。
从PyPI安装,使用:
pip install scrapy-djangoitem
简介
DjangoItem是从 django模型,只需创建一个DjangoItem,并指定什么django 与之相关的模型。
除了获取在项目上定义的模型字段之外,DjangoItem 提供一个方法,用该项创建并填充django模型实例 数据。
用法
DjangoItem的工作方式很像django中的modelforms,您可以创建一个子类 并将其django_model属性定义为有效的django模型。带着这个 您将得到一个项目,每个django模型字段都有一个字段。
此外,还可以定义模型中不存在的字段,甚至 覆盖模型中存在的字段,在项中定义这些字段。
让我们看一些例子:
为示例创建django模型:
from django.db import models class Person(models.Model): name = models.CharField(max_length=255) age = models.IntegerField()
定义基本的DjangoItem:
from scrapy_djangoitem import DjangoItem class PersonItem(DjangoItem): django_model = Person
DjangoItem的工作方式就像垃圾一样:
>>> p = PersonItem() >>> p['name'] = 'John' >>> p['age'] = '22'
要从项中获取django模型,我们调用extra方法 DjangoItem.save()的DjangoItem:
>>> person = p.save() >>> person.name 'John' >>> person.age '22' >>> person.id 1
当我们调用DjangoItem.save()时,模型已经保存,我们 可以通过使用commit=False调用它来防止这种情况。我们可以利用 commit=False在DjangoItem.save()方法中获取未保存的模型:
>>> person = p.save(commit=False) >>> person.name 'John' >>> person.age '22' >>> person.id None
如前所述,我们可以在项目中添加其他字段:
import scrapy from scrapy_djangoitem import DjangoItem class PersonItem(DjangoItem): django_model = Person sex = scrapy.Field()
>>> p = PersonItem() >>> p['name'] = 'John' >>> p['age'] = '22' >>> p['sex'] = 'M'
我们可以用您自己的代码覆盖模型的字段:
class PersonItem(DjangoItem): django_model = Person name = scrapy.Field(default='No Name')
这有助于向字段提供属性,如默认值或任何其他 项目使用的属性。那些额外的字段不会被占用 进行DjangoItem.save()时的帐户。
注意事项
DjangoItem是将scrapy项目与django集成的一种非常方便的方法 模型,但要记住,如果你刮了很多,django orm可能伸缩性不好 有碎片的物品。这是因为关系后端是 对于写密集型应用程序(如web)通常不是一个好的选择 crawler),特别是当数据库高度规范化并且有许多索引时。
设置
要在django应用程序之外使用django模型,需要设置 DJANGO_SETTINGS_MODULE环境变量,在大多数情况下,修改 能够导入设置的PYTHONPATH环境变量 模块
根据您的用例和偏好,有很多方法可以做到这一点。 下面详细介绍了一种最简单的方法。
假设您的django项目名为mysite,位于路径中 /home/projects/mysite并且您已经使用模型创建了一个应用程序myapp。 Person。这意味着您的目录结构如下:
/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 环境变量并设置环境变量 DJANGO_SETTINGS_MODULE到mysite.settings。这可以在你的 通过添加下面的行,scrapy的设置文件:
import sys sys.path.append('/home/projects/mysite') import os os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
注意,我们修改了sys.path变量,而不是PYTHONPATH 环境变量,因为我们已经在python运行时中了。如果一切 是的,您应该能够启动scrapy shell命令并导入 模型Person(即from myapp.models import Person)。
从Django 1.8开始,如果使用 它位于manage.py上下文之外 (见Django Docs):
import django django.setup()
开发
可以使用^{tt45运行来自tests目录的测试套件}$通过运行:
tox
…使用tox.ini中的配置。Python解释器 必须在系统上本地安装。
更改日志
v1.1.1(2016-05-04)
- 作为万向轮分配
- 修复自述文件的标记
v1.1(2016-05-04)
- Python 3.4/3.5支持
- 使测试再次与Django 1.9一起工作
v1.0(2015-04-29)
- 初始版本