Scrapy扩展,用于使用Django模型编写抓取项
项目描述
scrapy-djangoitem是一个扩展,允许您使用现有的Django模型来定义Scrapy项。
此实用程序提供了一个名为DjangoItem的新类,您可以用作常规Scrapy项,并通过其django_model属性将其链接到Django模型。通过从此包导入它立即开始使用它
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 的工作方式与 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 通过运行 tox 从 tests 目录运行测试套件
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 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 2c633ae1559f6e3d43c9a5ebb19aa5a64152deef434aa3fa57168e6b002d9c50 |
|
MD5 | fbd7c04100fd4e95d7ea43e99ab7ba40 |
|
BLAKE2b-256 | 50107b8d1caf3c292069b1bc983c2c872597f429bac4673707d11ee76313515a |
scrapy_djangoitem-1.1.1-py2.py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 58da093778f2cd92734b5539adcb60d59854475050d7511c42173bd8c104acef |
|
MD5 | 85e5614159e8164e7fd434a8c95668ea |
|
BLAKE2b-256 | 5cffca88e5fa4b5df11876d877c568de8f5e1a06587bcd23dab7d1847a9b1123 |