您现在的位置是:烟消火灭网 > 娱乐
爬取旅游网站可视化分析完整代码
烟消火灭网2026-10-17 07:58:42【娱乐】9人已围观
简介去年国庆前想看看各大旅游平台到底在推什么目的地,顺手写了个爬虫抓携程和去哪儿的热门推荐页。结果挺有意思——排名前20的“必去”景点里,有7个是同一家OTA旗下合作景区,价格还比隔壁平台贵出12%到18
去年国庆前想看看各大旅游平台到底在推什么目的旅游地,顺手写了个爬虫抓携程和去哪儿的网站热门推荐页。结果挺有意思——排名前20的可视“必去”景点里,有7个是化分同一家OTA旗下合作景区,价格还比隔壁平台贵出12%到18%。析完数据摆在那里,整代不分析一下说不过去。旅游
整个流程分三块:抓数据、网站洗数据、可视出图。化分代码用Python,析完主要靠requests和BeautifulSoup,整代可视化走pyecharts,旅游比matplotlib好看,网站适合做地图和热力图。可视
爬虫部分:别硬刚,先看robots.txt
携程的页面结构改得勤,直接写死CSS选择器基本活不过两周。我的做法是抓JSON接口,比解析HTML稳定得多。以携程“热门目的地”为例,实际请求的是https://m.ctrip.com/restapi/soa2/13444/json/getHotDestList,POST过去带个_fxpcqlniredt参数就行。下面是最小可用代码:
import requests, json, pandas as pd url = "https://m.ctrip.com/restapi/soa2/13444/json/getHotDestList" headers = { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)", "Content-Type": "application/json" } payload = { "head": { "cid": "09031012345678901234", "ctok": "", "cver": "1.0"}} resp = requests.post(url, json=payload, headers=headers, timeout=10) data = resp.json()["destList"] rows = [] for item in data: rows.append({ "city": item["name"], "score": item["score"], "price": item.get("avgPrice", 0), "province": item["provinceName"] }) df = pd.DataFrame(rows) df.to_csv("ctrip_hot.csv", index=False) 去哪儿那边更简单,直接GET就行,但要注意它返回的JSON里价格字段是字符串带“¥”符号,得用正则洗掉。df["price"] = df["price"].str.replace(r"[^\d]", "", regex=True).astype(float)。不洗的话后面算均价直接报错。
可视化:地图比柱状图直观十倍
用pyecharts的Map组件,把省份作为维度,价格均值做颜色映射。代码不长:
from pyecharts.charts import Map from pyecharts import options as opts province_price = df.groupby("province")["price"].mean().round(0).to_dict() map_chart = ( Map() .add("均价(元)", list(province_price.items()), "china") .set_global_opts( title_opts=opts.TitleOpts(title="热门目的地均价分布"), visualmap_opts=opts.VisualMapOpts(max_=3000, min_=500, is_piecewise=False) ) ) map_chart.render("price_map.html") 跑出来一看,云南和海南颜色最深,均价破2500;西北几个省反而在800以下。但注意——新疆的均价低是因为大量数据来自淡季推荐,实际7月去一趟喀纳斯,机票加住宿轻松过5000。爬虫抓的是平台推荐价,不是真实成交价,这个偏差得心里有数。
踩过的坑
携程的接口有频率限制,一秒超过3次就返回412。加个time.sleep(0.5)能解决。另外它偶尔会返回空列表,不是被封,是参数里的cid过期了,换一个就行。去哪儿的价格字段有时是区间“1200-1800”,我直接取中位数,比取最小值合理。
还有个细节:两个平台对“热门”的定义不同。携程按搜索量排,去哪儿按成交量排。所以同一城市在两个榜单里排名能差十几位。做对比分析时,我干脆把两个数据源合并后按城市名去重,取价格均值,虽然粗暴但能看趋势。
代码总共不到80行,跑一次大概40秒。数据存成CSV后,用pandas做透视表比在pyecharts里硬编码灵活得多。比如按“省份+价格区间”分组,能看出江浙沪的推荐集中在1500-2500档,而川渝有大量500-1000的低价选项——这跟平台补贴策略直接相关。
最后说一句:爬旅游网站别碰用户评论和订单数据,只抓公开的推荐列表,法律风险小。真要做商业分析,买官方API比爬划算,省下来的时间够你把可视化图表迭代三版。
很赞哦!(17771)
上一篇: 网站安全公告
下一篇: 运营棋牌游戏都需要哪些资质






