当前位置:   article > 正文

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

python房源推荐系统

最近到了做毕设的时间了,很多小伙伴都选择了房源推荐/可视化系统,那么我就用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查询

(三)登陆流程

在这里插入图片描述

 

 实现代码:

登陆:

  1. def login(request):
  2. if request.session.get('is_login', None):
  3. return redirect('/index')
  4. if request.method == "POST":
  5. login_form = UserForm(request.POST)
  6. message = "请检查填写的内容!"
  7. if login_form.is_valid():
  8. username = login_form.cleaned_data['username']
  9. password = login_form.cleaned_data['password']
  10. try:
  11. user = models.userinfo.objects.get(name=username)
  12. print(user.name)
  13. if user.password == hash_code(password):
  14. request.session['is_login'] = True
  15. request.session['user_id'] = user.id
  16. request.session['user_name'] = user.name
  17. return redirect('/')
  18. else:
  19. message = "密码不正确!"
  20. except:
  21. message = "用户不存在!"
  22. return render(request, 'login.html', locals())
  23. login_form = UserForm()
  24. return render(request, 'login.html', locals())

注册:

  1. def register(request):
  2. if request.session.get('is_login', None):
  3. # 登录状态不允许注册。
  4. return redirect("/")
  5. if request.method == "POST":
  6. register_form = RegisterForm(request.POST)
  7. message = "请检查填写的内容!"
  8. if register_form.is_valid(): # 获取数据
  9. username = register_form.cleaned_data['username']
  10. password1 = register_form.cleaned_data['password1']
  11. password2 = register_form.cleaned_data['password2']
  12. email = register_form.cleaned_data['email']
  13. sex = register_form.cleaned_data['sex']
  14. if password1 != password2: # 判断两次密码是否相同
  15. message = "两次输入的密码不同!"
  16. return render(request, 'register.html', locals())
  17. elif len(password1)<6:
  18. message = "密码必须大于6位!"
  19. else:
  20. same_name_user = models.userinfo.objects.filter(name=username)
  21. if same_name_user: # 用户名唯一
  22. message = '用户已经存在,请重新选择用户名!'
  23. return render(request, 'register.html', locals())
  24. same_email_user = models.userinfo.objects.filter(email=email)
  25. if same_email_user: # 邮箱地址唯一
  26. message = '该邮箱地址已被注册,请使用别的邮箱!'
  27. return render(request, 'register.html', locals())
  28. # 创建新用户
  29. new_user = models.userinfo.objects.create()
  30. new_user.name = username
  31. new_user.password = hash_code(password1)
  32. new_user.email = email
  33. new_user.sex = sex
  34. new_user.save()
  35. new_collection = models.Collection.objects.create()
  36. new_collection.name = username
  37. new_collection.count = 0
  38. new_collection.save()
  39. return redirect('/login/') # 自动跳转到登录页面
  40. register_form = RegisterForm()
  41. return render(request, 'register.html', locals())

(四)首页功能

 (五)个人中心

 

 数据分析代码:

  1. @csrf_exempt
  2. def chart(request):
  3. district_item = set(models.zufang.objects.values_list('district'))
  4. district_item = [i[0] for i in district_item]
  5. if request.method == "GET":
  6. selected = district_item[0]
  7. area_item = set(models.zufang.objects.values_list('area').filter(district=selected))
  8. area_item = [i[0] for i in area_item]
  9. else:
  10. show_chart = False
  11. area_item = set(models.zufang.objects.values_list('area').filter(district=request.POST.get('options1')))
  12. area_item = [i[0] for i in area_item]
  13. print(request.POST.get('options1'))
  14. print(request.POST.get('options2'))
  15. zufang_totol = models.zufang.objects.values().filter(
  16. district=request.POST.get('options1'),
  17. area=request.POST.get('options2'))
  18. print(zufang_totol.count())
  19. if zufang_totol.count() > 0:
  20. zheng_list = []
  21. he_list = []
  22. show_chart = True
  23. for i in zufang_totol:
  24. if i['form'] == "整租":
  25. j = list([int(i['price'].strip('-')), int(i['size'].strip('平米'))])
  26. zheng_list.append(j)
  27. else:
  28. j = list([int(i['price'].strip('-')), int(i['size'].strip('平米'))])
  29. he_list.append(j)
  30. return JsonResponse(
  31. {"area_item": area_item, "zheng_list": zheng_list, "he_list": he_list, "show_chart": show_chart},
  32. safe=False)
  33. else:
  34. show_chart = False
  35. return JsonResponse({"area_item": area_item, "show_chart": show_chart}, safe=False)
  36. return render(request, 'chart.html', locals())

 价格预测代码:

  1. @csrf_exempt
  2. def price(request):
  3. if request.method == "GET":
  4. contact_list = models.zufang.objects.values_list().order_by('id')
  5. contact_list = [i for i in contact_list]
  6. new_contact_list = random.sample(contact_list, 3)
  7. user_name = models.Collection.objects.get(name=request.session.get('user_name'))
  8. if user_name.count > 0:
  9. collection = user_name.collection
  10. collection = collection.split(",")
  11. collection = [int(i) for i in collection]
  12. find_index = []
  13. for item in collection:
  14. find_index.append(models.zufang.objects.values_list().filter(id=item)[0])
  15. find_index = [i for i in find_index]
  16. else:
  17. collection = []
  18. find_index = []
  19. if request.GET.get("update_item") == "ok":
  20. return JsonResponse({"new_contact_list": new_contact_list, "find_index": find_index}, safe=False)
  21. return render(request, 'price.html', locals())
  22. else:
  23. user_name = models.Collection.objects.get(name=request.session.get('user_name'))
  24. count = user_name.count
  25. if user_name.count > 0:
  26. collection = user_name.collection
  27. collection = collection.split(",")
  28. else:
  29. collection = []
  30. if request.POST.get("new") == "true":
  31. count += 1
  32. new_collection = request.POST.get("data_id")
  33. collection.append(new_collection)
  34. collection = ','.join(collection)
  35. new = models.Collection.objects.get(name=request.session.get('user_name'))
  36. new.collection = collection
  37. new.count = count
  38. new.save()
  39. else:
  40. count -= 1
  41. new_collection = request.POST.get("data_id")
  42. collection.remove(new_collection)
  43. collection = ','.join(collection)
  44. new = models.Collection.objects.get(name=request.session.get('user_name'))
  45. new.collection = collection
  46. new.count = count
  47. new.save()
  48. return JsonResponse({}, safe=False)

总结

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

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

2022年4月25日 更新:

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

 

 

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

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

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

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

综上。 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/362368
推荐阅读
相关标签
  

闽ICP备14008679号