项目整体结构:
├── django+scrapy
│ ├── example_bot
│ │ ├── __init__.py
│ │ ├── items.py
│ │ ├── pipelines.py
│ │ ├── settings.py
│ │ └── spiders
│ │ ├── __init__.py
│ │ └── example.py
│ └── scrapy.cfg
└── example_project
├── manage.py
├── myapp
│ ├── __init__.py
│ ├── models.py
│ ├── admin.py
│ └── views.py
└── example_project
├── __init__.py
├── settings.py
└── urls.py
django-admin.py startproject example_project
python manage.py startapp myapp
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=255)
age = models.IntegerField()
admin.site.register(ExampleDotCom)
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
这样Django部分就做好了
scrapy startproject example_bot
settings.py
import os
import sys
from django.core.wsgi import get_wsgi_application
DJANGO_PROJECT_PATH = 'YOUR/PATH/TO/DJANGO/PROJECT'
DJANGO_SETTINGS_MODULE = 'example_project.settings'
sys.path.insert(0, DJANGO_PROJECT_PATH)
os.environ['DJANGO_SETTINGS_MODULE'] = DJANGO_SETTINGS_MODULE
application = get_wsgi_application()
设置好环境路径后,就可以在scrapy项目的代码中导入Django模型了
from myapp.models import Person
pip install scrapy-djangoitem
在example_bot中的item.py:
from scrapy_djangoitem import DjangoItem
class PersonItem(DjangoItem):
django_model = Person
之后就可以像使用scrapyItem一样使用DjangoItem了
p = PersonItem()
p['name'] = 'John'
p['age'] = '22'
如果要通过item得到Django的模型,只需调用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
之后在scrapy项目的根目录下运行scrapy crawl example_bot
就可以了