首页 分享 Python+Django+爬虫+情感分析+机器/深度学习==搭建舆情分析系统——上篇(某博热搜数据用户主题与评论数据为例:代码非常仔细,值得借鉴,由于篇幅过长,分为上中下篇)

Python+Django+爬虫+情感分析+机器/深度学习==搭建舆情分析系统——上篇(某博热搜数据用户主题与评论数据为例:代码非常仔细,值得借鉴,由于篇幅过长,分为上中下篇)

来源:花匠小妙招 时间:2025-09-01 11:29

上篇内容:【环境配置、爬虫页面分析、爬取字段确认、数据模型建立与django基本页面搭建】

一、在Anaconda环境下创建虚拟环境

(1)打开Anaconda Prompt(install),创建虚拟环境,如下图所示:

方法一:默认情况下虚拟环境创建在Anaconda安装目录下的envs文件夹中

conda create --name WbUserComment #WbUserComment是虚拟环境名称(自定义)

方法二:如果想将虚拟环境创建在指定位置,使用–prefix参数即可:

conda create --prefix D:SoftwareEnvsWbUserComment python==3.9 #WbUserComment是虚拟环境名称(自定义)

(2)查看已经创建好的虚拟环境:

conda env list

(3)激活WbUserComment虚拟环境:

conda activate D:SoftwareEnvsWbUserComment

(4)删除WbUserComment虚拟环境:

conda remove --prefix D:SoftwareEnvsWbUserComment --all

二、虚拟环境下安装django、mysqlclient与pymysql

查看usermanage虚拟环境下有哪些已经安装的库:

conda list

方法一:

清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/ 华中科技大学:http://pypi.hustunique.com/ 豆瓣源:http://pypi.douban.com/simple/ 腾讯源:http://mirrors.cloud.tencent.com/pypi/simple 华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/

conda install django

conda install pymysql

conda install mysqlclient

or

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ django

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pymysql

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ mysqlclient

方法二(手动安装):

mysqlclient的url地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

pip install 保存路径+mysqlclient-1.4.6-cp39-cp39-win_amd64

三、创建创一个Django项目

(1)进入创建位置

(2)命令创建django项目

django-admin startproject WeiBoUserComment # WeiBoUserComment 项目名称

(3)进入项目目录,命令创建Django应用程序:

cd WeiBoUserComment

python manage.py startapp WbComment

(4)使用pycharm打开项目并配置环境变量,如下图所示:

最后记得点击每一页面中的【OK】按钮!!!

(5)在项目的settings.py文件中,将您的应用程序添加到INSTALLED_APPS列表中:

(6)在控制台输入python manage.py runserver命令,启动Django开发服务器

python manage.py runserver

点击地址:http://127.0.0.1:8000/ 到这里一个简单的django项目基本配置已经完成了!

四、分析爬取页面,明确爬取的数据,为数据模型做准备

网址:https://weibo.com/newlogin?tabtype=weibo&gid=102803&openLoginLayer=0&url=https%3A%2F%2Fweibo.com%2F

(1)打开爬取页面:按F12进入开发者模型,点击网络(network),滑动左边热搜页面,观察右边中名称(name)列的变化,发现疑似有数据接口地址,点击查看,寻找页面中的数据,最终确认数据接口,如下图所示:

接口地址:https://weibo.com/ajax/feed/hottimeline?refresh=2&group_id=102803&containerid=102803&extparam=discover%7Cnew_feed&max_id=1&count=10

(2)但是上面只是发布的主题数据,却没有用户评论数,因此点击评论且滑动评论寻找数据接口,观察右边中名称(name)列的变化,发现疑似有数据接口地址,点击查看,寻找页面中的数据,最终确认数据接口,如下图所示:【这是一级评论】

接口地址:https://weibo.com/ajax/statuses/buildComments?flow=0&is_reload=1&id=5032476139323565&is_show_bulletin=2&is_mix=0&count=10&uid=5091912327&fetch_level=0&locale=zh-CN

且发现评论【https://weibo.com/ajax/statuses/buildComments?flow=0&is_reload=1&id=5032476139323565&is_show_bulletin=2&is_mix=0&count=10&uid=5091912327&fetch_level=0&locale=zh-CN】接口中的id=5032476139323565与uid=5091912327是不同评论变换的关键且来自于上一个接口中每一个发布主题内的某些字段【https://weibo.com/ajax/feed/hottimeline?refresh=2&group_id=102803&containerid=102803&extparam=discover%7Cnew_feed&max_id=1&count=10】,如下图所示:

(3)因此最终找到了发布主题的接口以及对应评论接口,接下里明确爬取的字段:

(1)发布主题接口里面主要包括:发布用户的title,发布时间,发布来源,发布内容,点赞数量,评论数量,转发数量以及评论接口需要的id与uid。

(2)一级评论接口主要包括:发布用户的title,用户类型,发布时间,发布来源,评论内容,点赞数量,回复数据量,回复id(二级评论id),回复uid(二级评论uid)

在这里我主要爬取这些数据,还想爬取其它数据的自行分析!!!

五、在应用程序的 models.py 文件中定义数据模型,包括表格、字段和关联

(1)在这里我们将创建4个model(两张表):UserInfo(用户基本信息表)、UserPermission(用户权限表)、WbSub(微博用户发表主题数据表)与WbOnePl(微博用户主题一级评论数据表)

首先创建UserInfo(用户基本信息表)

在这里我们需要注意创建字段的类型有哪些(如:CharField、IntegerField、DateTimeField等),字段里面的属性有哪些(如:null=True, blank=True, on_delete=models.SET_NULL, verbose_name等)以及模型之间的关系(OneToOneField一对一等),代码如下:

#encoding:utf-8

from django.db import models

from django.contrib.auth.models import User,Group

class UserInfo(models.Model):

useraccount = models.CharField(max_length=200, blank=False, verbose_name="用户账号")

userpassword = models.CharField(max_length=200, blank=False,verbose_name="用户密码")

usertruename = models.CharField(max_length=20, blank=True, verbose_name="用户真实姓名")

usertelephone = models.CharField(max_length=20, blank=True,verbose_name="用户手机号")

userage = models.IntegerField(max_length=10, blank=True, verbose_name="用户年龄")

usersex = models.CharField(max_length=10, blank=True, choices=[('M', 'Male'), ('F', 'Female')],verbose_name="用户性别")

createTime = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

lastTime = models.DateTimeField(auto_now=True, verbose_name="修改时间")

remark = models.TextField(null=True, blank=True, verbose_name="备注")

# 外键关联数据创造者

creator = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name="创建者",

related_name="user_creator")

editor = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name="修改者",

related_name="user_editor")

class Meta:

verbose_name = "用户基本信息表"

verbose_name_plural = "用户基本信息表"

def __str__(self):

return self.useraccount

(2) 其次创建UserPermission(用户权限表)

# 用户权限表

class UserPermission(models.Model):

name = models.CharField(max_length=100,blank=True,verbose_name="权限名称")

code = models.IntegerField(max_length=100,blank=True, unique=True,verbose_name="权限编号")

# 一对多关联

user = models.ForeignKey(UserInfo, max_length=50,on_delete=models.CASCADE)

class Meta:

verbose_name = "用户权限表"

verbose_name_plural = "用户权限表"

(3) 再创建WbSub(微博用户发表主题数据表)

class WbSub(models.Model):

wbusertitle = models.CharField(max_length=100, null=True, blank=True, verbose_name="发布用户的title")

wbsource = models.CharField(max_length=100, null=True, blank=True,verbose_name="发布来源")

wbtext = models.TextField(blank=True, null=True, verbose_name="发布内容")

wbtime = models.DateTimeField(auto_now_add=True, verbose_name="发布时间")

wblikecount = models.IntegerField(max_length=10, null=True, blank=True, verbose_name="点赞数量")

wbcomecount = models.IntegerField(max_length=10, null=True, blank=True, verbose_name="评论数量")

wbrespcount = models.IntegerField(max_length=10, null=True, blank=True, verbose_name="转发数量")

wbplid = models.IntegerField(max_length=30, null=True, blank=True, verbose_name="评论接口id")

wbpluid = models.IntegerField(max_length=30, null=True, blank=True, verbose_name="评论接口uid")

class Meta:

verbose_name = "微博用户发表主题数据表"

verbose_name_plural = "微博用户发表主题数据表"

def __str__(self):

return self.wbusertitle

(4)最后创建WbOnePl(微博用户主题一级评论数据表)

class WbOnePl(models.Model):

plusertitle = models.CharField(max_length=100, null=True, blank=False, verbose_name="评论用户title")

plusertype = models.CharField(max_length=100, null=True, blank=False,verbose_name="评论用户类型")

plusersource = models.CharField(max_length=50, null=True, blank=True, verbose_name="评论用户来源")

plusertext = models.TextField(null=True, blank=True, verbose_name="评论内容")

plusertime = models.DateTimeField(null=True, auto_now=True, verbose_name="发布时间")

pluserlikes = models.IntegerField(max_length=10, null=True, blank=True, verbose_name="评论点赞数量")

pluserrepls = models.IntegerField(max_length=10, null=True, blank=True, verbose_name="评论回复数量")

pluserreolid = models.IntegerField(max_length=30, null=True, blank=True, verbose_name="二级评论id")

pluserreoluid = models.IntegerField(max_length=30, null=True, blank=True, verbose_name="二级评论uid")

# 外键关联数据主题表

WbSubId = models.ForeignKey(WbSub, on_delete=models.CASCADE) # 定义一对多的模型关系

class Meta:

verbose_name = "微博用户主题一级评论数据表"

verbose_name_plural = "微博用户主题一级评论数据表"

六、当models.py里面的代码书写完毕后,就可以进行数据库的迁移与超级管理员的创建

(1)首先去mysql数据库中新建一个名为Wbdata的数据库,如下所示:

mysql -u root -p

create database Wbdata

(2)在进行创建迁移之前需要对settings.py文件里面的数据库连接进行配置:

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'XXXX',

'USER': 'XXXX',

'PASSWORD': 'XXXX',

'HOST': 'XXXX',

'PORT': 'XXXX',

}

}

(3)创建迁移文件:运行以下命令创建一个新的迁移文件,用于记录模型的更改。

python manage.py makemigrations

执行完这条代码,项目里面就会生成一个迁移文件,如下图:

(4)应用迁移:运行以下命令将迁移应用到数据库中。

python manage.py migrate

执行完这条代码,数据库里面就会生成相应的表,如下图所示:

(5)运行以下命令创建超级管理员账户。

python manage.py createsuperuser

根据提示输入用户名、电子邮件和密码。

确认创建超级管理员账户。

创建成功后,可以使用该账户登录到Django管理后台,并进行管理操作。

(6)运行python manage.py runserver代码启动项目

python manage.py runserver

成功运行后,在网页中打开网址:http://127.0.0.1:8000/admin

(7)在(6)中的最后一张图中有两个内置model(表):Users与Groups

其中Users是超级管理员信息表(内置表),Groups是超级管理员权限相关信息配置表(内置表),可以在这两张表里面进行超级管理员的添加和权限配置

七、admin.py文件配置Django的管理后台(在上面我们在models.py创建了四个,但是发现并没有出现在后端管理内容中,因此需要在admin.py进行配置)

(1)了解admin.py的功能与使用

在Django中,admin.py文件用于配置Django的管理后台(admin site)。管理后台是一个内置的Django功能,提供了一个用户友好的界面,用于管理应用程序的数据和功能。

admin.py文件定义了在管理后台中显示和操作的模型(Model)和相关设置。通过在admin.py文件中注册模型,可以在管理后台中进行增删改查等操作,而无需手动编写和实现相关功能。

以下是admin.py文件的一些常见用途:

注册模型:通过在admin.py文件中导入模型类,并使用admin.site.register()方法注册模型,将其添加到管理后台中。这样,可以在管理后台中查看和编辑模型的数据。

自定义显示字段:通过在模型的ModelAdmin类中定义list_display属性,可以指定在管理后台中显示的字段。这样,可以自定义模型对象在管理后台中的列表视图。

过滤和搜索:通过在模型的ModelAdmin类中定义list_filter和search_fields属性,可以在管理后台中添加过滤和搜索功能。这样,可以根据指定的字段值来筛选和搜索模型的数据。

自定义表单:通过在模型的ModelAdmin类中定义form属性,可以自定义在管理后台中使用的表单。这样,可以添加额外的字段、验证规则和自定义行为。

权限管理:通过在模型的ModelAdmin类中定义list_display和list_editable属性,可以控制哪些用户可以查看和编辑模型的数据。这样,可以实现对不同用户的权限管理。

总之,admin.py文件是用于配置Django管理后台的地方。通过在该文件中定义模型的注册和相关设置,可以方便地在管理后台中管理应用程序的数据和功能。

(2)admin.py配置的基本属性

在Django的admin.py文件中,你可以使用以下属性来配置管理界面(Admin)的行为和显示:

list_display: 指定在管理界面中显示的字段列表。例如:list_display = ('field1', 'field2', ...)

list_filter: 指定在管理界面中可以进行过滤的字段列表。例如:list_filter = ('field1', 'field2', ...)

search_fields: 指定在管理界面中可以进行搜索的字段列表。例如:search_fields = ('field1', 'field2', ...)

list_per_page: 指定在管理界面中每页显示的记录数。例如:list_per_page = 20

list_editable: 指定在管理界面中可以直接编辑的字段列表。例如:list_editable = ('field1', 'field2', ...)

ordering: 指定在管理界面中默认的排序字段列表。例如:ordering = ('field1', 'field2', ...)

readonly_fields: 指定在管理界面中只读显示的字段列表。例如:readonly_fields = ('field1', 'field2', ...)

exclude: 指定在管理界面中排除显示的字段列表。例如:exclude = ('field1', 'field2', ...)

fieldsets: 指定在管理界面中按照分组显示的字段。例如:

fieldsets = (

('Group 1', {

'fields': ('field1', 'field2'),

}),

('Group 2', {

'fields': ('field3', 'field4'),

'classes': ('collapse',),

}),

)

actions: 指定在管理界面中可用的批量操作。例如:

actions = ['action1', 'action2']

其中,action1和action2是自定义的批量操作方法。

以上是一些常用的属性,你可以根据自己的需求在admin.py文件中使用这些属性来配置管理界面的行为和显示。此外,Django还提供了更多的属性和方法,你可以查阅官方文档以获取更详细的信息。

(3)以下是我在admin.py里面的基本设置

# encoding:utf-8

# Register your models here.

from WbComment import models

from django.contrib import admin

from django.contrib.auth.admin import UserAdmin

from django.contrib.auth.models import Permission, Group

# Register your models here.

admin.site.site_header = "舆情分析系统"

admin.site.site_title = "舆情分析系统后台管理"

@admin.register(models.UserInfo)

class UserInfoAdmin(admin.ModelAdmin):

list_display = ("useraccount", "userpassword", "usertruename", "usertelephone", "usersex", "userage")

search_fields = ("useraccount", "usertruename", "usertelephone")

list_filter = ("usersex",)

list_editable = ("userpassword", "usertelephone")

list_display_links = ("usertruename",)

model_icon = "fa fa-tag" # 设置element图标

list_per_page = 10 # 分页

ordering = ["userage"] # 排序

# 保存当前发布用户

def save_model(self, request, obj, form, change):

if form.is_valid():

if change:

obj.editor = request.user

else:

obj.creator = request.user

obj.editor = request.user

obj.save()

super().save_model(request, obj, form, change)

@admin.register(models.UserPermission)

class PermissionAdmin(admin.ModelAdmin):

list_display = ("name", "code","user")

@admin.register(models.WbSub)

class WbSubAdmin(admin.ModelAdmin):

list_display = ("wbusertitle", "wbsource", "wbtext", "wbtime", "wblikecount", "wbcomecount","wbrespcount","wbplid","wbpluid")

search_fields = ("wbusertitle", "wbtext", "wbsource")

# list_filter = ("usersex",)

# list_editable = ("userpassword", "usertelephone")

list_display_links = ("wbusertitle",)

# model_icon = "fa fa-tag" # 设置element图标

list_per_page = 10 # 分页

ordering = ["wbtime"] # 排序

# 保存当前发布用户

def save_model(self, request, obj, form, change):

if form.is_valid():

if change:

obj.editor = request.user

else:

obj.creator = request.user

obj.editor = request.user

obj.save()

super().save_model(request, obj, form, change)

@admin.register(models.WbOnePl)

class WbOnePlAdmin(admin.ModelAdmin):

list_display = ("plusertitle", "plusertype", "plusersource", "plusertext", "plusertime", "pluserlikes", "pluserrepls")

search_fields = ("plusertitle", "plusertype", "plusersource")

# list_filter = ("usersex",)

# list_editable = ("userpassword", "usertelephone")

list_display_links = ("plusertitle",)

model_icon = "fa fa-tag" # 设置element图标

list_per_page = 10 # 分页

ordering = ["plusertime"] # 排序

# 保存当前发布用户

def save_model(self, request, obj, form, change):

if form.is_valid():

if change:

obj.editor = request.user

else:

obj.creator = request.user

obj.editor = request.user

obj.save()

super().save_model(request, obj, form, change)

(4)结果展示

你可以在这些表里面进行数据的增删改查:

八、美化后台管理(我们发现上面的后台管理样式有些简单,因此可以通过多种方式美化后台管理)

(1)方法简介:

在Django中,可以通过多种方式对后台进行美化和自定义。以下是一些常见的方式:

自定义admin模板:Django的管理后台使用了默认的模板,可以通过自定义模板来改变后台的外观和布局。在项目的templates目录下,可以创建admin目录,并在其中创建与默认模板相同的目录结构和文件。然后,在自定义模板中修改HTML和CSS样式,以实现自定义的美化效果。

使用第三方库:有许多第三方库可以帮助美化Django的管理后台。例如,django-admin-bootstrap可以为后台添加Bootstrap样式,django-jet提供了现代化和响应式的后台主题,django-grappelli提供了一套漂亮的后台主题等。可以根据需求选择合适的第三方库,并按照它们的文档进行安装和配置。

自定义admin样式:可以通过自定义CSS样式来修改后台的外观。可以在项目的static目录下创建admin目录,并在其中创建一个名为"css"的子目录。然后,在该目录中创建一个名为"admin.css"的文件,并在其中编写自定义的CSS样式。然后,在项目的settings.py文件中添加STATICFILES_DIRS设置,指定静态文件的路径。

使用Django插件:有一些Django插件可以帮助美化后台,提供更多的自定义选项和功能。例如,django-suit提供了一套现代化的后台主题和自定义选项,django-admin-tools提供了一些额外的工具和布局选项等。

这些是一些常见的方式,可以用于美化和自定义Django的管理后台。可以根据需求和偏好选择适合的方式,并根据文档和示例进行配置和使用。

(2)在使用Django SimpleUI来美化Django的管理后台之前,需要先创建一个名为"templates"的文件夹和一个名为"static"的文件夹

templates文件夹:用于存放Django SimpleUI的模板文件。在该文件夹中,你可以创建自定义的模板文件来覆盖SimpleUI默认的模板文件,以满足你的特定需求。

static文件夹:用于存放Django SimpleUI的静态文件,如CSS、JavaScript和图片等。这些文件将用于渲染SimpleUI的页面和样式。

在创建这两个文件夹时,需要将它们放置在Django项目的根目录或app目录下,具体取决于你的项目结构和需求。然后,你需要在Django的settings.py文件中进行相关配置,以告诉Django去哪里查找这些文件。

并在settings.py里面添加相关路径:

# 模板配置

TEMPLATES = [

{

"BACKEND": "django.template.backends.django.DjangoTemplates",

# 'DIRS': [BASE_DIR, 'templates'], # 早期语法,不适用

# 'DIRS': [os.path.join(BASE_DIR), 'templates'], # 早期语法,不适用

'DIRS': [BASE_DIR/'templates'], # 正确的方法

"APP_DIRS": True,

"OPTIONS": {

"context_processors": [

"django.template.context_processors.debug",

"django.template.context_processors.request",

"django.contrib.auth.context_processors.auth",

"django.contrib.messages.context_processors.messages",

],

},

},

]

# 静态文件配置

STATIC_URL = '/static/'

STATICFILES_DIRS = [

os.path.join(BASE_DIR, 'static'),

]

同时对settings.py里面的其它选项进行修改:

1、DEBUG:该设置用于指定是否启用调试模式。在开发环境中,可以将其设置为True,以便在出现错误时显示详细的错误信息。在生产环境中,应将其设置为False。示例:DEBUG = True

2、SECRET_KEY:该设置用于指定Django项目的秘密密钥,用于加密会话和其他安全相关的操作。示例:SECRET_KEY = 'your-secret-key' (这个可以先不进行设置)

3、ALLOWED_HOSTS:该设置用于指定允许访问Django项目的主机名。在生产环境中,应将其设置为项目实际使用的域名或IP地址。示例:ALLOWED_HOSTS = ['example.com', 'www.example.com'] (这个可以先不进行设置)

4、语言的修改:LANGUAGE_CODE = 'zh-hans'

5、时区的修改:`在这里插入代码片`TIME_ZONE = 'Asia/Shanghai'

(3)使用Django SimpleUI来美化Django的管理后台

3.1 安装django-simpleui

pip install django-simpleui -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 settings.py文件中的INSTALLED_APPS加入一行simpleui

INSTALLED_APPS = [

"simpleui",

"django.contrib.admin",

"django.contrib.auth",

"django.contrib.contenttypes",

"django.contrib.sessions",

"django.contrib.messages",

"django.contrib.staticfiles",

"usermanage",

]

3.3 settings.py文件中的TEMPLATES的OPTIONS中的context_processors加入’django.template.context_processors.request’

TEMPLATES = [

{

"BACKEND": "django.template.backends.django.DjangoTemplates",

'DIRS': [os.path.join(BASE_DIR, 'templates')],

"APP_DIRS": True,

"OPTIONS": {

"context_processors": [

"django.template.context_processors.debug",

"django.template.context_processors.request",

"django.contrib.auth.context_processors.auth",

"django.contrib.messages.context_processors.messages",

],

},

},

]

3.4 在MIDDLEWARE列表中添加’simpleui.middleware.SimpleMiddleware’中间件:

MIDDLEWARE = [

"django.middleware.security.SecurityMiddleware",

"django.contrib.sessions.middleware.SessionMiddleware",

"django.middleware.common.CommonMiddleware",

"django.middleware.csrf.CsrfViewMiddleware",

"django.contrib.auth.middleware.AuthenticationMiddleware",

"django.contrib.messages.middleware.MessageMiddleware",

"django.middleware.clickjacking.XFrameOptionsMiddleware",

#"simpleui.middleware.SimpleMiddleware",

]

3.5 启动项目,如下所示:

精彩内容

评论可见,查看隐藏内容

相关知识

AI知识图谱:机器学习、深度学习、数据分析、数据挖掘「附脑图」
机器学习案例——鸢尾花数据集分析
互联网舆情分析平台
干货分享:Python数据分析工具
艾普思咨询:2022七夕大数据洞察及舆情分析报告(21页).pdf
基于Python+django的爬虫的李宁品牌销售数据分析系统设计与实现(源码+文档+部署讲解等)
【创新课题】火龙果种植户种植决策系统:基于python爬虫火龙果电商销售数据可视化分析
基于深度学习的田间杂草检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)
数据分析的方法论
基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

网址: Python+Django+爬虫+情感分析+机器/深度学习==搭建舆情分析系统——上篇(某博热搜数据用户主题与评论数据为例:代码非常仔细,值得借鉴,由于篇幅过长,分为上中下篇) https://www.huajiangbk.com/newsview2290097.html

所属分类:花卉
上一篇: 古诗词里的丁香花有多美?忧伤哀婉
下一篇: 人教版小学语文六年级上册《丁香结

推荐分享