去年我接到一个很有意思的课程设计题目:基于Python的携程网数据可视化分析。说白了就是从携程网上抓酒店、景点或者机票的公开数据,用Python做清洗和分析,最后用图表把结论直观地展示出来。这个项目做完之后,我觉得它特别适合用来练手——爬虫、数据处理、可视化三个Python最常用的方向全占了,而且数据源真实、分析结果能落地,不像很多教程里用的假数据那样脱离实际。
这篇博文就把我完整做下来的过程、踩过的坑、以及各环节的取舍逻辑都写清楚。不管你是刚学Python想找项目练手,还是做毕业设计需要参考,或者是想了解一套完整的数据分析流程,这篇内容应该都能帮到你。
1. 项目整体设计与技术选型
1.1 核心需求解析:这个项目到底在做什么
拿到这个题目,第一个要弄明白的是:数据分析可视化这四个字,拆开来看其实是三件事。
第一件事是数据获取。携程网有海量的公开页面,包含酒店价格、评分、点评数量、位置区域、景点热度等信息。这些数据散落在网页的HTML结构里,需要通过爬虫程序去抓取。第二件事是数据加工。抓下来的原始数据往往是脏的——价格带货币符号、评分是字符串、有的字段直接缺失,必须清洗成规整的结构化数据才能用。第三件事是可视化呈现。清洗完的数据要回答几个问题,比如价格分布呈现什么规律、评分和价格有没有相关性、哪个区域的酒店最集中,这些结论需要用图表直观地呈现出来。
目标明确之后,整个项目的技术路线也就清晰了:requests做请求、lxml或BeautifulSoup做解析、pandas做清洗、pyecharts或matplotlib做可视化。这套组合是目前最主流的数据分析流程,社区生态成熟,出了问题几乎都能搜到解决方案。
1.2 技术选型:为什么用这套组合而不选别的
项目里最核心的选型决策有三个,这里展开讲讲我当时的考虑。
爬虫框架到底要不要用Scrapy。 很多教程一上来就推荐Scrapy,但我最后选择了requests + BeautifulSoup的组合。原因很简单:这个项目的目标是数据分析和可视化,爬虫只是前置环节。Scrapy是完整的爬虫框架,功能强大但也更重,需要写middleware、配置settings、跑spider项目,学习成本高。而携程酒店列表页和详情页的结构相对规整,requests加解析库完全能搞定,代码量少、调试直观。如果你想系统学爬虫,Scrapy是后面的事,但在这个项目里,别为了用框架而用框架。
requests库的生命周期问题。 我记得这个项目做完时requests库已经出了好几个大版本,后来又有人问我为什么不用httpx或者aiohttp做异步并发。这个我在后面会专门讲,这里先给出结论:项目初始设计用同步requests完全够用,数据量在千条级别时,同步抓取的耗时是可以接受的。异步并发会引入复杂性,对新手不友好,而且容易触发反爬。
可视化工具选pyecharts还是matplotlib。 这是一个两难的问题。matplotlib是Python可视化的老牌库,功能全面、文档最多、生成的图表是静态图片,适合论文和报告。pyecharts是百度ECharts的Python封装,生成的图表是交互式HTML页面,鼠标悬停能看到数值,可以缩放、拖拽,观感明显更现代。考虑到这个项目带“可视化分析”这四个字,最终呈现效果的直观性很重要,我选择了pyecharts作为主可视化工具,个别场景(比如评分分布直方图)配合matplotlib使用。
这里有个经验供参考:如果项目面向学术论文,优先matplotlib,因为是矢量图,印刷清晰;如果面向展示演示或个人博客,pyecharts的交互效果更出彩。两个都装也不冲突,必要时可以混用。
1.3 项目目录结构规划
动手写代码之前,我先把项目目录规划好。很多新手拿到项目就写一个main.py写到底,爬到一半发现代码混乱到改不下去了。合理的目录结构应该按职责拆分:
text复制ctrip-analysis/
├── spider/
│ ├── __init__.py
│ ├── hotel_spider.py # 爬虫主逻辑
│ ├── parser.py # 页面解析函数
│ └── user_agents.py # 请求头池
├── data/
│ ├── raw/ # 原始HTML或JSON文件
│ └── cleaned/ # 清洗后的CSV数据
├── analysis/
│ ├── __init__.py
│ ├── clean.py # 数据清洗模块
│ └── stats.py # 统计分析模块
├── charts/
│ └── generate.py # 可视化生成脚本
├── output/ # 图表输出目录
├── requirements.txt
└── config.py # 全局配置(URL、参数等)
这个结构的好处是每个文件职责单一,爬虫挂了不影响清洗和可视化环节,数据可以缓存下来反复使用,不用每次都重新爬。我实际开发中体会很深的一点是:数据一旦爬到本地,后续的所有调试都不需要再发请求,既避免了对目标网站的频繁访问,也能在离线状态下安心调图表样式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据采集:携程网爬虫从入门到实战
2.1 确定采集目标与分析字段
动手爬之前,先想清楚爬什么。我这次选择的是携程酒店数据,采集字段包括:
- 酒店名称
- 所属区域(行政区/商圈)
- 最低价格
- 综合评分
- 点评数量
- 酒店地址
- 星级/档次标签
为什么选酒店而不选机票或景点?因为酒店数据的采集和清洗难度适中,字段多为文本和数字,适合做多维分析。机票数据价格波动大、字段依赖出发地和日期组合,对爬虫和清洗逻辑要求更高,容易打击新手信心。
2.2 请求头的完整配置与反爬应对
携程的页面有基础的反爬措施,直接裸requests访问大概率拿到的是验证页面。实战中,最关键的是把请求头伪装成真实浏览器。我的请求头配置如下:
python复制headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accep
