基于Django+链家+Bootstrap真实数据的房源推荐/可视化系统

最近到了做毕设的时间了,很多小伙伴都选择了房源推荐/可视化系统,那么我就用Python的Django给大家做一个吧!

一、实现思路及相关技术

所用到的技术栈:

  • Python---->Django
  • Bootstrap
  • 爬虫
  • Mysql
  • Html
  • Css
  • Javascript

二、框架介绍

Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区。使用这种架构,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序。这也正是OpenStack的Horizon组件采用这种架构进行设计的主要原因。另外,在Dj ango框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性 [2]  。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:

  1. 用于创建模型的对象关系映射

  2. 为最终用户设计较好的管理界面;

  3. URL 设计;

  4. 设计者友好的模板语言;

  5. 缓存系统。

django logo

Django(发音:[`dʒæŋɡəʊ]) 是用python语言写的开源web开发框架(open source web framework),它鼓励快速开发,并遵循MVC设计。Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。

Django 根据比利时的爵士音乐家Django Reinhardt命名,他是一个吉普赛人,主要以演奏吉它为主,还演奏过小提琴等。

由于Django在近年来的迅速发展,应用越来越广泛,被著名IT开发杂志SD Times评选为2013 SD Times 100,位列“API、库和框架”分类第6位,被认为是该领域的佼佼者 [3]  。

三、系统整体功能框架 

 四、详细实现

(一)数据获取

1、获取租房房源信息

很抱歉,由于爬虫部分涉及具体网站造成侵权行为,故删除此部分代码

 (二)数据库

加上Django数据迁移的表,一共这些表

 数据库连接

用pymysql连接本地mysql数据库,首先通过pip安装pymysql并创建好数据库以及数据库表,导入pymysql包,打开数据库连接,使用cursor()方法创建一个游标对象,使用execute()方法执行SQL查询

(三)登陆流程

在这里插入图片描述

 

 实现代码:

登陆:

def login(request):
    if request.session.get('is_login', None):
        return redirect('/index')

    if request.method == "POST":
        login_form = UserForm(request.POST)
        message = "请检查填写的内容!"
        if login_form.is_valid():
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            try:
                user = models.userinfo.objects.get(name=username)
                print(user.name)
                if user.password == hash_code(password):
                    request.session['is_login'] = True
                    request.session['user_id'] = user.id
                    request.session['user_name'] = user.name
                    return redirect('/')
                else:
                    message = "密码不正确!"
            except:
                message = "用户不存在!"
        return render(request, 'login.html', locals())

    login_form = UserForm()
    return render(request, 'login.html', locals())

注册:

def register(request):
    if request.session.get('is_login', None):
        # 登录状态不允许注册。
        return redirect("/")
    if request.method == "POST":
        register_form = RegisterForm(request.POST)
        message = "请检查填写的内容!"
        if register_form.is_valid():  # 获取数据
            username = register_form.cleaned_data['username']
            password1 = register_form.cleaned_data['password1']
            password2 = register_form.cleaned_data['password2']
            email = register_form.cleaned_data['email']
            sex = register_form.cleaned_data['sex']
            if password1 != password2:  # 判断两次密码是否相同
                message = "两次输入的密码不同!"
                return render(request, 'register.html', locals())
            elif len(password1)<6:
                message = "密码必须大于6位!"
            else:
                same_name_user = models.userinfo.objects.filter(name=username)
                if same_name_user:  # 用户名唯一
                    message = '用户已经存在,请重新选择用户名!'
                    return render(request, 'register.html', locals())
                same_email_user = models.userinfo.objects.filter(email=email)
                if same_email_user:  # 邮箱地址唯一
                    message = '该邮箱地址已被注册,请使用别的邮箱!'
                    return render(request, 'register.html', locals())

                # 创建新用户
                new_user = models.userinfo.objects.create()
                new_user.name = username
                new_user.password = hash_code(password1)
                new_user.email = email
                new_user.sex = sex
                new_user.save()
                new_collection = models.Collection.objects.create()
                new_collection.name = username
                new_collection.count = 0
                new_collection.save()
                return redirect('/login/')  # 自动跳转到登录页面
    register_form = RegisterForm()
    return render(request, 'register.html', locals())

(四)首页功能

 (五)个人中心

 

 数据分析代码:

@csrf_exempt
def chart(request):
    district_item = set(models.zufang.objects.values_list('district'))
    district_item = [i[0] for i in district_item]
    if request.method == "GET":
        selected = district_item[0]
        area_item = set(models.zufang.objects.values_list('area').filter(district=selected))
        area_item = [i[0] for i in area_item]

    else:
        show_chart = False
        area_item = set(models.zufang.objects.values_list('area').filter(district=request.POST.get('options1')))
        area_item = [i[0] for i in area_item]
        print(request.POST.get('options1'))
        print(request.POST.get('options2'))
        zufang_totol = models.zufang.objects.values().filter(
            district=request.POST.get('options1'),
            area=request.POST.get('options2'))
        print(zufang_totol.count())
        if zufang_totol.count() > 0:
            zheng_list = []
            he_list = []
            show_chart = True
            for i in zufang_totol:
                if i['form'] == "整租":
                    j = list([int(i['price'].strip('-')), int(i['size'].strip('平米'))])
                    zheng_list.append(j)
                else:
                    j = list([int(i['price'].strip('-')), int(i['size'].strip('平米'))])
                    he_list.append(j)
            return JsonResponse(
                {"area_item": area_item, "zheng_list": zheng_list, "he_list": he_list, "show_chart": show_chart},
                safe=False)
        else:
            show_chart = False
            return JsonResponse({"area_item": area_item, "show_chart": show_chart}, safe=False)

    return render(request, 'chart.html', locals())

 价格预测代码:

@csrf_exempt
def price(request):
    if request.method == "GET":
        contact_list = models.zufang.objects.values_list().order_by('id')
        contact_list = [i for i in contact_list]
        new_contact_list = random.sample(contact_list, 3)
        user_name = models.Collection.objects.get(name=request.session.get('user_name'))
        if user_name.count > 0:
            collection = user_name.collection
            collection = collection.split(",")
            collection = [int(i) for i in collection]
            find_index = []
            for item in collection:
                find_index.append(models.zufang.objects.values_list().filter(id=item)[0])
            find_index = [i for i in find_index]
        else:
            collection = []
            find_index = []
        if request.GET.get("update_item") == "ok":
            return JsonResponse({"new_contact_list": new_contact_list, "find_index": find_index}, safe=False)
        return render(request, 'price.html', locals())

    else:
        user_name = models.Collection.objects.get(name=request.session.get('user_name'))
        count = user_name.count
        if user_name.count > 0:
            collection = user_name.collection
            collection = collection.split(",")
        else:
            collection = []
        if request.POST.get("new") == "true":
            count += 1
            new_collection = request.POST.get("data_id")
            collection.append(new_collection)
            collection = ','.join(collection)
            new = models.Collection.objects.get(name=request.session.get('user_name'))
            new.collection = collection
            new.count = count
            new.save()
        else:
            count -= 1
            new_collection = request.POST.get("data_id")
            collection.remove(new_collection)
            collection = ','.join(collection)
            new = models.Collection.objects.get(name=request.session.get('user_name'))
            new.collection = collection
            new.count = count
            new.save()

        return JsonResponse({}, safe=False)

总结

项目不足:目前并未实时爬取数据存入数据库,导致数据更新不及时,有能力的朋友可以自己爬取数据存储

---------------------------------------------------------------------------------------------------------------------------------

2022年4月25日 更新:

 1)新增链家官网爬虫,可以将最新的数据实时存储到数据库

 

 

2)之前版本主页全是一张图作为房源的缩略图,现因为数据库增加了picture和link字段,故每个房源均为不同的缩略图且能跳转到链家官网

 3)根据用户收藏行为,新增协同推荐算法

 (4)更新预测模型,正确填写信息之后,将会使用预测模型预测出来价格

(5)由于数据库的数据结构改变,故发布房源增加图片url和跳转url输入框

综上。 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值