0 关键
携程网其最大的特点就是:基本上所有的有效数据都是通过Ajax异步请求获取的。本博客的主要内容为:
- 构造Ajax请求,获得返回的reviews数据,由于返回的数据为JSON格式,很好分析
- 判定是否爬完酒店评论
- 直接获取评论数目,想要通过评论下方页码获得总页数比较麻烦,通过分析返回的reviews数据,发现其中有评论数据字段。
- 通过分析不存在评论页面的Ajax请求的返回数据特征,完成爬取结束的判断。
下面以https://hotels.ctrip.com/hotels/375126.html为例进行分析
1 获取评论数据
1.1 网页分析
首先,查看网页源代码,发现其中没有评论的数据,这说明评论数据应该是通过Ajax请求获取的。对该网页进行抓包,并查看抓取到的xhr类型数据,其中有一个名为GetReviewList
的xhr包,顾名思义,很可能就是加载评论的请求。进一步查看其返回数据:
可以判定,该请求就是加载评论的请求。
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":