跳转到主要内容

Scrapy扩展,用于使用Django模型编写抓取项

项目描述

PyPI Version Build Status License

scrapy-djangoitem是一个扩展,允许您使用现有的Django模型来定义Scrapy项

此实用程序提供了一个名为DjangoItem的新类,您可以用作常规Scrapy项,并通过其django_model属性将其链接到Django模型。通过从此包导入它立即开始使用它

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 的工作方式与 Scrapy 项相同

>>> p = PersonItem()
>>> p['name'] = 'John'
>>> p['age'] = '22'

要获取项的 Django 模型,我们调用 DjangoItem 的额外方法 DjangoItem.save()

>>> person = p.save()
>>> person.name
'John'
>>> person.age
'22'
>>> person.id
1

在调用 DjangoItem.save() 时,模型已经被保存,我们可以通过调用它并带有 commit=False 来防止这种情况。我们可以在 DjangoItem.save() 方法中使用 commit=False 来获取一个未保存的模型

>>> 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 模型集成的做法,但请注意,如果你的 Scrapy 爬取了大量的项(例如数百万项),Django ORM 可能 可能不会很好地扩展。这是因为关系型后端通常 不是一个写密集型应用程序(如网络爬虫)的理想选择,尤其是如果数据库高度规范化且有多个索引。

设置

要在 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,还必须显式设置 Django(参见 Django 文档

import django
django.setup()

开发

可以使用 tox 通过运行 toxtests 目录运行测试套件

tox

…使用 tox.ini 中的配置。所使用的 Python 解释器必须安装在系统本地。

变更日志

v1.1.1(2016-05-04)

  • 以通用轮发布

  • 修复 README 的标记

v1.1(2016-05-04)

  • Python 3.4/3.5 支持

  • 使测试再次与 Django 1.9 一起工作

v1.0(2015-04-29)

  • 初始版本

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

scrapy-djangoitem-1.1.1.tar.gz (5.2 kB 查看散列

上传时间

构建分布

scrapy_djangoitem-1.1.1-py2.py3-none-any.whl (8.3 kB 查看散列

上传时间 Python 2 Python 3

由以下提供支持