最近在做个爬取招聘信息的项目,由于涉及到后期在网站上展示,所以希望直接将 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 中,这里使用到一个库
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
这样,存储部分的代码就搭建好了。
本系列的第一篇文章到此,也许有同学会问,如果要存外键该怎么办?
请听下回分解。