20242218 2025-2026-2 《Python程序设计》实验4报告

20242218 2025-2026-2 《Python程序设计》实验4报告

课程:《Python程序设计》
班级:2422
姓名:段锦坤
学号:20242218
实验教师:王志强
实验日期:2026年5月21日
必修/选修:公选课

1. 实验内容

1.1 综合实践要求

本次综合实践要求开发一个完整的Python应用程序,需包含以下内容:

  1. 爬虫技术:爬取旅游相关数据(景点、美食、酒店等)
  2. 数据处理:数据清洗、存储和管理
  3. 可视化展示:地图展示、数据可视化
  4. Web应用:构建完整的旅游信息查询系统
  5. 用户交互:收藏功能、搜索历史、天气查询等

1.2 功能要求

程序需实现至少5个功能模块:

  • 城市搜索与天气查询
  • 景点、美食、酒店信息展示
  • 地图定位与导航
  • 用户收藏管理
  • 智能推荐系统

2. 实验过程及结果

2.1 系统架构设计

本系统采用Flask框架构建,分为前端展示层、业务逻辑层和数据访问层三个层次:

层次 技术栈 主要功能
前端展示层 HTML5、CSS3、JavaScript、Leaflet 用户界面展示、地图交互、数据可视化
业务逻辑层 Flask、Python API接口、业务逻辑处理、数据整合
数据访问层 SQLite、高德API 数据存储、POI数据爬取、天气数据获取

2.2 核心功能模块

2.2.1 城市搜索与天气查询模块

该模块实现城市搜索、定位和实时天气查询功能:

# 城市搜索API
@app.route('/api/cities/search')
def search_cities():
    query = request.args.get('q', '')
    if not query:
        return jsonify({'code': 400, 'message': '请输入搜索关键词'})
    
    results = city_service.search_cities(query)
    return jsonify({'code': 200, 'data': results})

# 天气查询API
@app.route('/api/weather')
def get_weather():
    city = request.args.get('city', '')
    if not city:
        return jsonify({'code': 400, 'message': '请指定城市'})
    
    weather = weather_service.get_weather(city)
    return jsonify({'code': 200, 'data': weather})

2.2.2 POI数据爬取模块

使用高德地图API爬取景点、美食、酒店数据:

class POIService:
    def search_poi(self, city_name, keywords):
        # 优先从数据库获取
        db_data = self._get_from_database(city_name, keywords)
        if db_data:
            return db_data
        
        # 从高德API获取
        api_data = self._fetch_from_api(city_name, keywords)
        if api_data:
            self._save_to_database(city_name, keywords, api_data)
            return api_data
        
        return self._get_mock_poi(city_name, keywords)
    
    def _fetch_from_api(self, city_name, keywords):
        url = f"https://restapi.amap.com/v3/place/text"
        params = {
            'keywords': keywords,
            'city': city_name,
            'key': self.api_key,
            'types': self._get_type_code(keywords),
            'offset': 20,
            'page': 1
        }
        response = requests.get(url, params=params, verify=False)
        data = response.json()
        return self._parse_poi_data(data)

2.2.3 地图展示模块

使用Leaflet.js实现交互式地图:

// 初始化地图
function initMap() {
    map = L.map('map').setView([39.9042, 116.4074], 11);
    
    // 添加高德地图图层
    L.tileLayer('https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7', {
        attribution: '高德地图'
    }).addTo(map);
    
    // 添加比例尺和缩放控件
    L.control.scale({position: 'bottomleft'}).addTo(map);
    
    // 监听地图点击事件
    map.on('click', function(e) {
        handleMapClick(e.latlng);
    });
}

2.2.4 用户收藏管理模块

实现收藏的增删改查功能,数据存储在localStorage中:

// 收藏功能
function toggleFavorite(name, category, cityName = '', extraInfo = {}) {
    if (!favorites.spots) favorites.spots = [];
    if (!favorites.foods) favorites.foods = [];
    if (!favorites.hotels) favorites.hotels = [];
    
    const key = category;
    const index = favorites[key].findIndex(item => item.name === name);
    const isNowFavorite = index === -1;
    
    if (isNowFavorite) {
        favorites[key].unshift({
            name: name,
            city: cityName || '',
            rating: extraInfo.rating || '',
            address: extraInfo.address || '',
            addedAt: new Date().toISOString()
        });
    } else {
        favorites[key].splice(index, 1);
    }
    
    localStorage.setItem('travelFavorites', JSON.stringify(favorites));
    updateFavoriteButtons(name, isNowFavorite);
    updateFavoritesStats();
}

2.2.5 智能推荐模块

基于用户行为和热门数据进行推荐:

@app.route('/api/daily-recommend')
def daily_recommend():
    # 获取热门景点
    hot_spots = poi_service.get_hot_spots('北京', limit=3)
    
    # 获取推荐美食
    hot_foods = poi_service.search_poi('成都', '美食')[:3]
    
    # 获取推荐酒店
    hot_hotels = poi_service.search_poi('北京', '酒店')[:3]
    
    return jsonify({
        'code': 200,
        'data': {
            'spots': hot_spots,
            'foods': hot_foods,
            'hotels': hot_hotels
        }
    })

2.3 系统运行结果

2.3.1 首页展示

系统首页展示了地图、城市搜索、今日推荐等功能模块:

image

2.3.2 城市搜索功能

支持模糊搜索城市,实时显示搜索结果:

image

2.3.3 景点详情展示

点击景点卡片可展开查看详细信息,包括图片、评分、开放时间等:

image

2.3.4 智能旅游推荐

根据用户设定参数进行智能路线规划,以及每日随机推荐:

image

image

2.3.5 我的收藏页面

收藏列表按类别展示(景点、美食、酒店),支持倒序排列:

image

2.4 代码托管

项目代码已托管到Gitee仓库:

Python旅游文化系统

2.5 演示视频

项目成果演示视频

3. 实验过程中遇到的问题和解决过程

3.1 问题1:跨域请求被阻止

问题描述:前端调用后端API时出现跨域错误。

解决方案:安装Flask-CORS扩展并配置:

from flask_cors import CORS

app = Flask(__name__)
CORS(app, resources={r"/api/*": {"origins": "*"}})

3.2 问题2:高德API返回数据编码问题

问题描述:高德API返回的中文数据在控制台输出时出现乱码。

解决方案:在请求时设置正确的编码:

response = requests.get(url, params=params)
response.encoding = 'utf-8'
data = response.json()

3.3 问题3:图片加载失败

问题描述:部分景点图片URL无法正常加载。

解决方案:实现备用图片机制,当主图片加载失败时显示占位图:

function loadSpotImage(spot, index) {
    const container = document.getElementById(`spot-image-${index}`);
    if (spot.photo_url) {
        container.innerHTML = `<img src="${spot.photo_url}" 
            alt="${spot.name}" 
            onerror="this.parentElement.innerHTML='<div class=\'spot-image-placeholder\'>🌸 图片加载失败</div>'">`;
    }
}

3.4 问题4:Header被遮挡

问题描述:详情面板的Header在滚动时被内容遮挡。

解决方案:使用Flexbox布局,固定Header位置:

.detail-panel {
    display: flex;
    flex-direction: column;
    overflow-y: auto;
}

.detail-header {
    flex-shrink: 0;
    z-index: 100;
    position: relative;
}

3.5 问题5:收藏列表排序问题

问题描述:收藏列表没有按时间倒序排列。

解决方案:在显示收藏列表时按添加时间排序:

items.sort((a, b) => new Date(b.addedAt) - new Date(a.addedAt));

4. 课程总结与感想

回顾这学期《Python程序设计》课程的学习历程,我收获颇丰。从最初对Python的陌生好奇,到如今能够利用Python独立开发完整的Web应用,这段经历让我对编程有了全新的认识。课程从基础语法开始,循序渐进地引导我们掌握变量、数据类型、控制流程等核心概念,随后又深入到面向对象编程、文件操作、网络编程等进阶内容。特别是通过三次实验和这次综合实践,我不仅学会了编写代码,更学会了如何用编程思维解决实际问题。

在综合实践项目中,我深刻体会到理论与实践结合的重要性。开发旅游文化系统的过程中,我遇到了许多挑战:从API接口设计到前端页面布局,从数据爬取到数据库管理,每一个环节都需要认真思考和反复调试。记得刚开始接触Flask框架时,面对陌生的装饰器语法和路由概念,我感到有些无从下手。但通过查阅文档、观看教程和不断尝试,我逐渐理解了框架的设计思想,最终成功搭建起完整的后端服务。这个过程让我明白,编程能力的提升离不开持续的学习和实践。

这次实践也让我对软件工程有了更深的理解。一个完整的项目需要合理的架构设计、清晰的代码结构和完善的错误处理机制。在开发过程中,我学会了将复杂功能拆解成多个模块,分步骤实现,这种模块化的思维方式不仅提高了代码的可维护性,也让开发过程更加高效。同时,我也意识到团队协作和代码规范的重要性,良好的代码风格和注释能让团队成员更好地理解和维护代码。

作为一名大学生,这门课程不仅教会了我Python编程技能,更培养了我的逻辑思维和问题解决能力。在未来的学习和工作中,我会继续深入学习Python及其相关技术,不断提升自己的编程水平。同时,我也希望课程能够增加更多的实践环节,让我们有更多机会将理论知识应用到实际项目中,进一步提升动手能力。此外,引入更多真实案例和团队项目也能帮助我们更好地适应未来的工作环境,培养团队协作精神。

总而言之,这门课程为我打开了编程世界的大门,让我在代码的海洋中找到了探索的乐趣。感谢王老师这学期的辛勤付出和悉心指导,我会继续努力,在编程的道路上不断前行。

5. 参考资料

posted @ 2026-06-15 23:05  Silylorica  阅读(13)  评论(0)    收藏  举报