scrapy 集成到 django(一) - 建立项目

最近在做个爬取招聘信息的项目,由于涉及到后期在网站上展示,所以希望直接将 scrapy 集成到 django 中。
思路为 scrapy 爬下的数据直接通过 django-orm 保存到数据库。

在国内外网站中关于 django+scrapy 的技术文章较少,折腾了蛮久,最后希望记录一下折腾过程。

由于是个人总结性的文章,而非教程,所以本系列文章不适用于刚接触 django 和 scrapy 的同学,而两部分都有使用经验的同学可以借鉴参考。

项目地址: recruitment

创建项目

首先是创建 django 项目,然后是在 django 根目录下创建 scrapy 项目


$ django-admin startproject recruitment
$ cd recruitment
$ python manage.py startapp backend
$ srapy startproject crawlend
$ cd crawlend
$ scrapy genspider zhilian zhilian.com


这样就创建好了基本的项目结构,如下图所示:

.
├── backend
│   ├── admin.py
│   ├── apps.py
│   ├── httpbin.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── __init__.py
│   ├── models.py
│   ├── static
│   │   └── backend
│   │       ├── css
│   │       │   ├── bootstrap.css
│   │       │   └── lab.css
│   │       ├── img
│   │       └── js
│   │           ├── bootstrap.js
│   │           └── jquery-3.2.1.js
│   ├── templates
│   │   └── backend
│   │       └── base.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── crawlend
│   ├── crawlend
│   │   ├── headers.py
│   │   ├── __init__.py
│   │   ├── items.py
│   │   ├── middlewares.py
│   │   ├── pipelines.py
│   │   ├── proxies.py
│   │   ├── settings.py
│   │   └── spiders
│   │       ├── httpbin.py
│   │       ├── __init__.py
│   │       ├── lagou.py
│   │       └── zhilian.py
│   └── scrapy.cfg
├── manage.py
├── README.md
├── recruitment
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── requirments.txt

由于我的项目进度领先与写文章的进度,所以项目结构在细节上有些不同。

配置 django 部分

由于是 scrapy 集成到 django 部分,所以 django 部分不会与 scrapy 有太多交集,按照一般的 django 项目建立方法即可。

细节代码就不贴了,配置流程如下

1、修改 settings.py

  • 添加 apps
  • 修改 database (使用 mysql)
    2、修改 recruitment/urls.py
    3、增加 backend/urls.py
    4、增加 templates 文件夹
    5、增加 static 文件夹
    6、更改 models.py 增加字段
    7、更改 admin.py
    8、迁移数据库
    9、创建超级用户
    10、运行 django 项目,查看是否正常

考虑到文章之后还会有用到 models.py 的内容,给出代码


class Recruit(models.Model):

    resource = models.CharField('信息来源', max_length=255)
    url = models.URLField('信息链接', default='')
    # ...

class Firm(models.Model):
    # 公司相关信息
    firm_introduction = models.TextField('公司简介')
    # ...


配置 scrapy 部分

1、scrapy 中添加 django 环境
crawlend/settings.py


import os, django
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(BASE_DIR)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "recruitment.settings")
django.setup()

2、配置 items 和 pipelines

比较重要的一步在于如何将 scrapy 爬下的数据接入到 django-orm 中,这里使用到一个库

scrapy_djangoitem

items.py


import scrapy
from scrapy_djangoitem import DjangoItem
from backend.models import Recruit, Firm


class CrawlendItem(DjangoItem):
    # define the fields for your item here like:
    # name = scrapy.Field()
    django_model = Recruit

class FirmItem(DjangoItem):
    django_model = Firm

pipelines.py


from .items import CrawlendItem, FirmItem


class CrawlendPipeline(object):

    def process_item(self, item, spider):
        # 不做任何处理
        # item.save()
        # return item

        # 分别处理
        if isinstance(item, CrawlendItem):
            item.save()
            return item

        if isinstance(item, FirmItem):
            item.save()
            return item

这样,存储部分的代码就搭建好了。

本系列的第一篇文章到此,也许有同学会问,如果要存外键该怎么办?

请听下回分解。

posted @ 2017-08-06 17:35  zx576  阅读(2188)  评论(1编辑  收藏  举报