最近到了做毕设的时间了,很多小伙伴都选择了房源推荐/可视化系统,那么我就用Python的Django给大家做一个吧!
一、实现思路及相关技术
所用到的技术栈:
- Python---->Django
- Bootstrap
- 爬虫
- Mysql
- Html
- Css
- Javascript
二、框架介绍
Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区。使用这种架构,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序。这也正是OpenStack的Horizon组件采用这种架构进行设计的主要原因。另外,在Dj ango框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性 [2] 。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:
-
用于创建模型的对象关系映射;
-
为最终用户设计较好的管理界面;
-
URL 设计;
-
设计者友好的模板语言;
-
缓存系统。
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输入框
综上。