python 爬虫 一键爬取携程旅游团数据

本文介绍了如何使用Python爬虫抓取携程旅游团的评价数据,包括获取旅行项目名字和ID、详细页数据。首先分析携程旅游团首页和详情页的数据格式,然后通过requests库构造请求,获取销量前四的旅游团信息。在详细页,由于评价数据是动态加载的,需要进一步查找xhr请求获取。最终实现爬取评价时间、内容和评分等关键信息。
摘要由CSDN通过智能技术生成

python 爬虫 一键爬取携程旅游团数据

前言

最近我的好朋友在做期末大作业,需要分析疫情前后对旅游行业的影响。于是,就求助我,想让我帮忙趴取一下携程旅游团的评价数据,包括评价时间、评价内容、评分这三条数据。
源码已上传到GitHub,有需要的伙伴自取:源码地址,如果有帮到你,不要忘记给个小⭐⭐

网站分析

第一步 查看首页数据格式

首先我们打开协程网站,随便搜一个地点,这里我以重庆为例:

地址:https://vacations.ctrip.com/list/whole/d-chongqing-158.html?from=do&startcity=2

在这里插入图片描述

大概就是这么个页面形式,为了减少工作量的同时,获取到更多的数据,我们采用销量优先的筛选模式,对这些参团游进行重新排序。

在这里插入图片描述

我们可以看到,排名前几名的都有非常可观的评价数,这里我们就取排名前4的旅游团

我们在当前页面按F12 进入开发者模式,看看当前呈现在我们面前的数据的原貌是什么

这里需要注意一点,进入开发者模式后,我们需要先点击另一个排序模式,再点回销量优先:
在这里插入图片描述

这样做的原因就是单纯的刷新页面,由于有些数据之前已经加载过了,就不会再进行请求了。

对了,在进行第二次点击时,注意点击clear (就在红点旁边),清除一下

这次,我们来看看加载了哪些数据:

在这里插入图片描述
这里我们先选择XHR进行筛选,过滤掉图片、js、css等文件。

这么多请求,哪个是我们需要的呢?最好的办法呢,就是一个一个看!

这里我就不给大家演示了,就直接用红色框标出来我们需要的

在这里插入图片描述
我们将右边的json数据的进行展开,会发现,在products这个里面,就是我们需要的数据:
在这里插入图片描述

这里我把products种的第一个数据赋值过来大家看看:

{
            "id":1020423035,
            "name":"重庆4日自由行·【爆红名宿&网红拍照圣地】精选民宿·套房任选丨全家出动·渝见你的温馨时光丨走步道·坐索道·看轻轨·赏夜景·吃火锅·不一样的旅行",
            "type":1,
            "typeName":"自由行",
            "level":0,
            "price":0,
            "departureCityId":2,
            "saleMode":"S",
            "brandName":"携程自营",
            "saleCount":0,
            "commentCount":44,
            "commentScore":4.6,
            "buType":"GT",
            "saleout":false,
            "hotelName":"滨之星商务度假公寓(重庆解放碑店) 重庆斯维登服务公寓(解放碑协信公馆) 重庆两江公馆服务公寓(解放碑大唐诺亚店) 重庆渝佳酒店公寓解放碑日月光店 重庆斯维登服务公寓(解放碑大唐诺亚) 重庆大唐诺亚服务公寓 重庆云尚轻奢酒店公寓 重庆解放碑日月光云菲度假公寓 重庆一瓦涧精品民宿酒店 coco北欧小居住宿(重庆解放碑店) 久栖·重庆日月光酒店公寓解放碑店",
            "hotelStar":0,
            "hotelStarLicence":0,
            "hotelCustomEval":0,
            "correlationScore":0
        }

经过英文提示和数据的对比,我们获取我们需要的信息

id:每个旅行项目的编号
saleMode:销售模式,S 表示self  猜测是自营的意思

至于多少人购买,总和评分这些我们不需要,在这里就不说了

找到我们要请求接口了,我们看看需要提交哪些数据吧:

在这里插入图片描述

{"contentType":"json","head":{"cid":"09031160411534832517","ctok":"","cver":"1.0","lang":"01","sid":"8888","syscode":"09","auth":"","extension":[]},"version":"80400","client":{"trace":"none","device":"PC","source":"NVacationSearchV2","variables":[{"key":"SHXVERSION","value":"B"}],"cid":"1590973576257.dfu8z"},"poiType":{"poid":158,"type":"D","keyword":"重庆"},"filtered":{"sort":2,"channel":"Online","tab":"A126","saleCity":2,"startCity":2,"pageSize":30,"pageIndex":1,"items":[]},"returnType":{"type":"all","filters":"ProductNewLine,ProductLine,HotDestination,HotScenicSpot,SaleDepartureStat,TravelDays,DepartureDate,Month,ProductPattern,ProductLevel,ADSuitPersons,ProductDistrict,ProviderBrand,PriceRange,Promotion,OnSale","recommendProduct":true}}

这就是一个json形式的数据,然后我们看一下请求地址:https://vacations.ctrip.com/list/restapi/gateway/13561/search?_fxpcqlniredt=09031160411534832517

我们只需要构造请求数据,然后发送到请求地址就可以获取我们想要的数据啦,接着往下看吧

第二步 查看详细页数据格式

前面我们获取了首页的数据,接下来面临一个问题:我们如何通过主页进入到详情页呢?

通常我们都是先在html数据页面获取每个旅行项目详情页的链接,但是,这个项目并不直接给你提供这样的链接,而是通过js进行自行组装(我猜测的)。先不管了,我们先点击看看链接形式是什么样的

在这里插入图片描述
地址链接:https://vacations.ctrip.com/tour/detail/p1020423035s2.html

我们再点击第二个旅游项目的详情页:

链接地址:https://vacations.ctrip.com/tour/detail/p2563522s2.html

我们再拿出来前面我们获取的第一个旅游项目的id编号:1020423035

这下我们能够发现,这两个链接只有中间数字上的不同,而且,我们这中间的数字不是别的,就像该旅行项目的id编号。

我们有了详情页的地址,那么获取详情页的数据岂不是轻而易举?

NO NO NO !!!

事情没那么简单,这里我不带大家验证了,直接告诉大家,用户评价的数据是通过js后续请求加载进来的,直接通过请求htm地址页面,无法获取,除非你使用一些其他高级的手段,比如使用selenium工具包进行真实浏览器访问。扯远了 ,我们接下来还是通过F12控制台寻找数据

在这里插入图片描述

老样子,XHR 筛选数据,通过一个一个查找以及英文提示,我们很快的就能找到我们所需要的数据:

{
            "commentId":13705053,
            "originalId":0,
            "userId":"300****168",
            "userInfo":{
                "displayName":"300****168",
                "avatarUrl":"https://dimg04.c-ctrip.com/images/t1/headphoto/646/318/109/a865fe5f5465407d8befd5dc487a8554.jpg",
                "curLevelCode":"10",
                "curLevelName":"黄金贵宾"
            },
            "content":"难忘的一次旅行,走了几个经典路线,喜欢上重庆这座城市!重庆独特的城市文化,令人震撼的自然景观,都给我留下了
  • 15
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值