功能描述
写了一个爬虫项目,集成了scrapy的采集和django的admin后台,scrapy部分用terminal命令采集内容,通过pipline处理后写入mongodb,django的admin后台通过使用ckediter富文本编辑器实现可视化编辑,编辑完并保存后,通过在admin.py中的action中编写数个简单的功能,就能批量代码和文件分别推送到远程数据库和ftp目录。
Django(v3.1.5)的setting.py配置文件的engine默认不支持mongodb,但是要使用django的admin后台又要用自带的ORM models才行。通过借助python的第三方模块djongo可以实现这个需求。
安装djongo
pip install djongo
setting.py文件内容
安装完djongo之后,以下为django项目配置文件中数据库部分的配置,localhost没有设置用户名和密码,可以参见下方的完整配置。
DATABASES = {
'default': {
'ENGINE': 'djongo', # 默认为'django.db.backends.sqlite'
'ENFORCE_SCHEMA': True, # 新增的条目
'NAME': 'dbname',
'CLIENT': {
'host': '127.0.0.1',
'port': 27017
}
}
}
完整配置如下(引用:说说 Django 如何优雅地对接 Mongodb)):
DATABASES = {
'default': {
'ENGINE': 'djongo',
'ENFORCE_SCHEMA': True,
'LOGGING': {
'version': 1,
'loggers': {
'djongo': {
'level': 'DEBUG',
'propogate': False,
}
},
},
'NAME': 'your-db-name',
'CLIENT': {
'host': 'host-name or ip address',
'port': port_number,
'username': 'db-username',
'password': 'password',
'authSource': 'db-name',
'authMechanism': 'SCRAM-SHA-1'
}
}
}
models.py注意事项
使用djongo模块之后,django orm的使用没有什么变化,同样要使用makemigrations和migrate命令建表,以及createsuperuser来设置账密。
有一点必须要注意,使用sqlite还有mysql的情况下,默认会给每个表添加id作为自增主键,添加记录的时候可以不用管id,但是使用mongodb的情况下,必须要给记录加id,且id必须为int类型,否则只能写入一条数据,其余全部报错,或者在后台点击文章的时候会显示找不到。
migrate之后,发现mongodb同样生成了主键id字段,并添加了唯一约束,在插入数据的时候是不会自动添加的。
以下为models.py中的数据表:
class Airticle(models.Model):
url = models.URLField(verbose_name="链接")
title = models.CharField(max_length=60,verbose_name="标题",null=True,blank=True)
time = models.CharField(max_length=30,verbose_name="发布时间",null=True,blank=True)
title_pic = models.ImageField(upload_to="headpic",null=True,verbose_name="图片")
content = RichTextUploadingField(default="",verbose_name="正文")
status = models.CharField(max_length=10,choices=(("0","未编辑"),("1","已编辑"),("2","已发布")),default=1,verbose_name="文章状态")
def __str__(self):
return self.title
class Meta:
verbose_name_plural = "采集文章"
处理id的部分代码,获取当前数据记录的数量并+1就是id的值,类似于:
query_set = models.models.Airticle.object.create(
id = models.Airticle.object.count() + 1,
# ……
)
query_set.save()
之后修改scrapy的设置,将数据写入由django生成的数据表中,这样使用pymongo或者其他方式导入数据的时候,即便有django用不上的字段也相安无事,这是django原本使用的关系型数据库无法做到的。