博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅

1、项目介绍

技术栈:
Django框架、requests爬虫、基于用户协同过滤推荐算法、MySQL数据库、多种推荐算法

旅游推荐系统

在当今快节奏的生活中,旅游已成为人们放松身心、探索未知世界的重要方式。然而,面对海量的旅游信息和景点选择,如何快速找到符合个人兴趣和偏好的目的地成为了一个挑战。为了解决这一问题,我们开发了一款基于Django框架的旅游数据爬取推荐系统。该系统集成了requests爬虫技术、用户协同过滤推荐算法以及MySQL数据库管理,旨在为用户提供个性化的旅游推荐服务。

旅游数据爬取推荐系统是一个基于用户协同过滤推荐算法的系统,使用Django框架进行开发,通过requests库进行数据爬取,数据存储在MySQL数据库中。

系统的主要功能是根据用户的兴趣和偏好,推荐他们可能感兴趣的旅游目的地或景点。该系统可以根据用户的历史行为和其他用户的行为,计算出用户之间的相似度,并根据相似度给出推荐结果。

2、项目界面

(1)旅游景点列表

在这里插入图片描述

(2)旅游景点详情页信息

在这里插入图片描述

(3)旅游推荐系统首页
在这里插入图片描述

(4)旅游景点推荐和评论功能
在这里插入图片描述
(5)旅游景点收藏和评分功能
在这里插入图片描述

(6)后台数据管理
在这里插入图片描述

(7)数据爬取
在这里插入图片描述

3、项目说明

旅游推荐系统

在当今快节奏的生活中,旅游已成为人们放松身心、探索未知世界的重要方式。然而,面对海量的旅游信息和景点选择,如何快速找到符合个人兴趣和偏好的目的地成为了一个挑战。为了解决这一问题,我们开发了一款基于Django框架的旅游数据爬取推荐系统。该系统集成了requests爬虫技术、用户协同过滤推荐算法以及MySQL数据库管理,旨在为用户提供个性化的旅游推荐服务。

一、系统核心功能

数据爬取与整合:
系统利用requests库强大的网络请求能力,从各大旅游网站和平台上爬取丰富的景点信息,包括名称、地址、图片、介绍、评分等。这些信息经过清洗和整合后,被存储到MySQL数据库中,为后续的分析和推荐提供坚实的数据基础。
个性化推荐:
基于用户协同过滤推荐算法,系统能够根据用户的历史行为(如浏览、收藏、评分等)和其他用户的行为,计算出用户之间的相似度。进而,为每位用户推荐与他们兴趣相似的旅游目的地或景点。这种算法的优势在于能够捕捉用户之间的潜在联系,实现更加精准的个性化推荐。
景点展示与详情查询:
系统提供了直观的旅游景点列表和详情页信息。用户可以在列表页快速浏览多个景点的缩略图和简要介绍,点击感兴趣的景点即可进入详情页,查看更多详细信息,如高清图片、详细地址、开放时间等。
推荐与评论功能:
在推荐系统首页,用户可以看到系统为他们精心挑选的推荐景点。同时,用户还可以对景点进行评论,分享自己的旅游体验和感受。这些评论不仅有助于其他用户了解景点的真实情况,还能为系统的推荐算法提供宝贵的用户反馈。
收藏与评分功能:
为了方便用户管理自己感兴趣的景点,系统提供了收藏功能。用户可以将自己喜欢的景点添加到收藏夹中,随时查看或分享。此外,用户还可以对景点进行评分,表达自己的喜好程度。这些评分数据将被系统用于优化推荐算法,提高推荐的准确性。
后台数据管理:
系统后台提供了强大的数据管理功能,管理员可以方便地查看、编辑和删除景点信息,以及管理用户数据和评论数据。这有助于确保数据的准确性和完整性,同时提升系统的安全性和可维护性。
二、系统优势

高效的数据爬取与整合能力:
利用requests库和MySQL数据库,系统能够快速、准确地从网络上爬取大量景点信息,并进行有效的存储和管理。
精准的个性化推荐服务:
基于用户协同过滤推荐算法,系统能够为用户提供高度个性化的旅游推荐服务,满足用户多样化的需求。
丰富的用户交互体验:
系统提供了直观的景点展示、详细的详情页信息、便捷的收藏与评分功能以及实时的评论与分享功能,为用户带来了丰富的交互体验。
强大的后台管理功能:
系统后台提供了全面的数据管理功能,有助于管理员高效地维护系统数据,确保系统的稳定性和安全性。
综上所述,这款旅游数据爬取推荐系统凭借其高效的数据处理能力、精准的个性化推荐服务以及丰富的用户交互体验,在旅游推荐领域展现出了巨大的潜力和价值。它不仅能够帮助用户快速找到符合个人兴趣和偏好的旅游目的地,还能为旅游行业提供有力的数据支持和智能化服务。未来,我们将继续优化算法、丰富功能、提升用户体验,致力于打造一个更加完善、更加智能的旅游推荐系统。

4、核心代码


# coding:utf-8
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render, redirect, HttpResponse
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.db.models import Q
from .algorithm import addr, ItemCF, UserCF
from tour.recomand import UserCf
from .models import *
import random
import json



@login_required(login_url='/login')
def init(request):
    # 推荐处理,根据游客的评分进行推荐
    recProducts = []
    datas = {}
    for user in User.objects.all():
        score = Score.objects.filter(user_id=user.id)
        dict = {}
        for sco in score:
            dict[sco.view_id] = sco.rate
        datas[user.username] = dict
    print("datas是",datas)

    userCf = UserCf(data=datas)

    recommandList = userCf.recomand(request.user.username, 10)  # 推荐10条 推荐列表  request.session.get('username')
    print("最终推荐:",recommandList)
    gue=View.objects.none()
    for r in recommandList:
        tables = View.objects.none()
        s_tables = tables.none()
        print(r)

        pro =View.objects.get(id=r[0])
        #s_tables += tables.filter(id=r[0])
        #gue=gue + View.objects.filter(id=r[0])
        recProducts.append({'id': pro.id, 'name': pro.view_name})

    print('pro ',pro )
    #print('s_tables ', s_tables)
    print(recProducts)

    if request.method == 'GET':
        # 热门推荐 按评分排序

        hot = View.objects.order_by('view_rate')[::-1]

        # 随机推荐某一地区景点


        #rand = View.objects.order_by('?')[:10]
        #rand = View.objects.filter(city=u'北京').order_by('view_rate')[::-1]
        rand = View.objects.all()

        # 猜你喜欢
        guess = recProducts

        data = {
            'hot': hot,
            'rand': rand,
            'guess': guess
        }
        print('随机猜测rand:', rand)
        print('guess:' ,guess)

        return render(request, 'index.html', data)


@csrf_exempt
@login_required(login_url='/login')
def detail(request):
    if request.method == 'GET':
        view_id = request.GET.get('id', False)
        view = View.objects.filter(id=view_id).first()

        # 类似推荐
        sim = View.objects.filter(city=view.city)

        # 该景点的评论
        comments = Comment.objects.filter(view=view).order_by('comment_date')[::-1]

        # 评分统计
        score = Score.objects.filter(view=view)
        pn = len(score)
        rate = round(sum(int(s.rate) for s in score) * 1.0 / pn, 1) if pn else 0.0#一位数平均

        collection = Collection.objects.filter(view=view, user=request.user)

        data = {
            'view': view,
            'sim': sim,
            'pn': pn,
            'comments': comments,
            'rate': rate,
            'collection': collection
        }
        print('view:' ,view)
        print('sim:', sim)
        print('comments:', comments)
        print('rate:', rate)
        print('collection:', collection)
        return render(request, 'detail.html', data)

    elif request.method == 'POST':
        comment = request.POST.get('text', False)
        view_id = request.POST.get('id', False)
        score = request.POST.get('score', False)
        collection = request.POST.get('collection', False)

        view = View.objects.get(id=view_id)

        msg = {
            'msg': '发生未知错误',
            'type': 'danger'
        }
        if comment:
            Comment.objects.create(user=request.user, view=view, comment=comment)
            msg['msg'] = '评论提交成功,页面即将刷新!'
            msg['type'] = 'success'

            return HttpResponse(json.dumps(msg), content_type='application/json')

        if score:
            score = int(score)
            s = Score.objects.filter(user=request.user, view=view)
            if s:
                s[0].rate = score
                s[0].save()
            else:
                Score.objects.create(user=request.user, view=view, rate=score)
            msg['msg'] = '感谢您的评分!'
            msg['type'] = 'success'
            return HttpResponse(json.dumps(msg), content_type='application/json')

        if collection:
            if collection == 'collection-true':
                Collection.objects.create(user=request.user, view=view)
                msg['msg'] = '收藏成功!'

            elif collection == 'collection-false':
                Collection.objects.filter(user=request.user, view=view).delete()
                msg['msg'] = '已取消收藏!'

            msg['type'] = 'success'
            return HttpResponse(json.dumps(msg), content_type='application/json')

        return HttpResponse(json.dumps(msg), content_type='application/json')


@csrf_exempt
def sign_in(request):
    if request.method == 'POST':
        username = request.POST.get('username', False)
        pw = request.POST.get('pw', False)
        user = authenticate(username=username, password=pw)
        if user:
            login(request, user)
            return redirect('/')

    if request.method == 'GET':
        username = request.GET.get('username', False)
        pw = request.GET.get('pw', False)
        if not username or not pw:
            return render(request, 'login.html')
        user = authenticate(username=username, password=pw)
        msg = {
            'msg': '登录成功,页面正在跳转!',
            'type': 'success'
        }
        if not user:
            msg['msg'] = '账号或密码错误,请检查后重新登录!'
            msg['type'] = 'danger'
        return HttpResponse(json.dumps(msg), content_type='application/json')


@csrf_exempt
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username', False)
        pw = request.POST.get('pw', False)
        email = request.POST.get('email', False)

        # 生成随机编号
        number = random.randint(1000000, 9999999)
        if not ExtUser.objects.filter(number=number):
            user = User.objects.create_user(username=username, password=pw, email=email)
            ExtUser.objects.create(user=user, number=number)
            user = authenticate(username=username, password=pw)
            login(request, user)
            return redirect('/')

    elif request.method == 'GET':
        username = request.GET.get('username', False)
        pw = request.GET.get('pw', False)
        rpw = request.GET.get('rpw', False)
        if not username or not pw:
            return render(request, 'register.html')
        msg = {
            'msg': '账号注册成功!',
            'type': 'success'
        }
        if not pw.isalnum():
            msg['msg'] = '密码只能由数字字母组成!'
            msg['type'] = 'danger'
        if pw != rpw:
            msg['msg'] = '两次输入的密码不一致!'
            msg['type'] = 'danger'
        if len(pw) < 6:
            msg['msg'] = '密码至少需要6个字符!'
            msg['type'] = 'danger'
        if User.objects.filter(username=username):
            msg['msg'] = '用户名已经存在!'
            msg['type'] = 'danger'

        return HttpResponse(json.dumps(msg), content_type='application/json')


def sign_out(request):
    logout(request)
    return redirect('/')


def search(request):
    if request.method == 'GET':
        word = request.GET.get('word', False)
        views = View.objects.filter(Q(province__contains=word) | Q(view_name__contains=word) | Q(city__contains=word))

        for v in views:
            score = Score.objects.filter(view=v)
            v.view_rate = sum(s.rate for s in score)*1.0/len(score) if score else 0

        return render(request, 'search.html', {'views': views})


@login_required(login_url='/login')
def collection(request):
    views = Collection.objects.filter(user=request.user)
    return render(request, 'collection.html', {'views': views})



@login_required(login_url='/login')
@csrf_exempt
def info(request):
    if request.method == 'GET':
        return render(request, 'info.html')
    elif request.method == 'POST':
        username = request.POST.get('username', False)
        password = request.POST.get('password', False)
        sex = request.POST.get('sex', False)
        age = request.POST.get('age', False)
        address = request.POST.get('address', False)

        user = request.user
        user.username = username
        if password:
            user.set_password(password)
        user.extuser.sex = sex
        user.extuser.age = age
        user.extuser.address = address
        user.extuser.save()
        user.save()

        return redirect('/login')




5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】、就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,查看下方👇🏻👇🏻

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐