使用django模型编写刮削项的scrapy扩展

scrapy-djangoitem的Python项目详细描述


PyPI VersionBuild StatusLicense

^ tt1}$是一个扩展,允许使用现有的{a5}定义Scrapy items

此实用程序提供一个名为DjangoItem的新类,您可以将其用作 常规的scrapy项并将其链接到django模型及其django_model 属性。立即开始使用,方法是从这个包中导入:

from scrapy_djangoitem import DjangoItem

安装

v1.1开始,Python 2.7Python 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=FalseDjangoItem.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并且您已经使用模型创建了一个应用程序myappPerson。这意味着您的目录结构如下:

/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_MODULEmysite.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)

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
当使用RequestDispatcher时,servlets Java最终没有被调用   java生成对具有可变参数数的方法的调用   java如何使用select子句中的参数化列映射iBATIS的查询?   java无法创建类型为org的插件。阿帕奇。登录中。log4j。果心阿佩德。元素RollingFile的RollingFileAppender   java当子实体和父实体之间存在OneTONE JPA关系时,是否可以将其与父实体一起持久化?   Android上的java Facebook集成fbconnect断开链接   获取方法调用方的java机制   从列表创建Oracle阵列时出现java问题   添加和检索元素的ArrayList的java ArrayList   在java中从字符串中删除无效的XML字符   java如何构建完整生成的maven模块   java如何准确地改变播放所有分辨率midi文件的速度?   shell javac:无效标志:/src/中位_度。ubuntu中的java   java使用从其他类的方法检索到的信息