python爬虫实践-01-携程酒店评论的爬取

0 关键

携程网其最大的特点就是:基本上所有的有效数据都是通过Ajax异步请求获取的。本博客的主要内容为:

  1. 构造Ajax请求,获得返回的reviews数据,由于返回的数据为JSON格式,很好分析
  2. 判定是否爬完酒店评论
    1. 直接获取评论数目,想要通过评论下方页码获得总页数比较麻烦,通过分析返回的reviews数据,发现其中有评论数据字段。
    2. 通过分析不存在评论页面的Ajax请求的返回数据特征,完成爬取结束的判断。

下面以https://hotels.ctrip.com/hotels/375126.html为例进行分析

1 获取评论数据

1.1 网页分析

首先,查看网页源代码,发现其中没有评论的数据,这说明评论数据应该是通过Ajax请求获取的。对该网页进行抓包,并查看抓取到的xhr类型数据,其中有一个名为GetReviewList的xhr包,顾名思义,很可能就是加载评论的请求。进一步查看其返回数据:

image-20210612120704966

可以判定,该请求就是加载评论的请求。

1.2 Ajax请求分析

通过头部信息,可知其请求的URL为,requestURL="https://m.ctrip.com/restapi/soa2/16709/json/GetReviewList"

Request Headers 和 Request Payload,其中当请求参数以表单形式提交时,会有Request Payload

对于Requests Headers,其中关键字段为:cookie、user-agent、UserIP,但事实上,即使不加头部,也能够正常地获取到请求的数据,为了保证浏览器获取数据和爬虫程序获取数据的一致性,还是加上user-agent,以及userIP(可以从抓到的包中获得)。

ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
userIP = "120.236.174.150"

对于Request Payload,以json类型存在,其字段如下:

requestPayload = {
   
  "PageNo": 1, //评论页码
  "PageSize": 10,//每页包含的评论数目
  "MasterHotelId": 375126,//酒店的ID
  "NeedFilter": true,
  "UnUsefulPageNo": 1,
  "UnUsefulPageSize": 5,
  "isHasFold": false,
  "head": {
   
    "Locale": "zh-CN",
    "Currency": "CNY",
    "Device": "PC",
    "UserIP": userIP,
    "Group": "",
    "ReferenceID": "",
    "UserRegion": "CN",
    "AID": "4897",
    "SID": "155952",
    "Ticket": "",
    "UID": "",
    "IsQuickBooking": "",
    "ClientID": "1619451283416.eo1bls",
    "OUID": "index",
    "TimeZone": "8",
    "P": "49241000217",
    "PageID": "102003",
    "Version": "",
    "HotelExtension": 
  • 7
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值