其中必要重要的一个包是/hotel/query/ota/basic的这个包。
其发送的JSON为:
其中需要关注的几个值分别是:
- token:这个值需要自己抓包来获取,具体生成机制不明,但是很久都不会变。
- checkInDate和checkOutDate分别是入住和离店时间的时间戳,在爬虫中可以用time.time()来生成。
- city就是utf-8编码的城市名,cityCode也需要抓包获得。
接收到的JSON为:
其中data存储了每个酒店的一些基本信息,点开可以获得,此处需要关注的值是:
- hotelSum指出查询的城市的酒店数量
- data中获取chainCode和innName分别就是酒店的编号和酒店名。
然后,随便点开一家7天酒店,关注/hotel/roomStatus这个包
需要关注的值是:
- token同上
- beginDate和endDate同样是时间戳
- chainID 和上文中的chainCode相同,都是酒店的编号
至于积分免费房的信息的具体位置,就在返回的JSON中,通过如下的解析判断方式可以获得免费房信息,其中hotel就是返回的JSON字符串经过loads后的字典。
此时也就完成了所有的准备工作,获取了所有需要的url、request的body及其参数。
二、爬虫编写
因为代码较长,故不在此放出,请移步github:
下载后需要在项目中新建一个token.ini配置文件,内容是:
代码主要分为两个文件:
运行hotel.py获得指定城市的所有7天酒店列表,用SQLite进行存储,因为每个城市只需要最多几次的请求,所以没有引入多线程。
运行示例如图:
数据库中将存储如下数据。其中其中free_room指的是酒店是否有免费房,默认是0,提供则为1。
运行room.py获得指定城市所有酒店的免费房状态。其中指定了城市,指定了查询日期距离当天的天数,例如查询当天信息则为0。
因为一个城市中需要查询的酒店数量在几十个左右,网络IO占据了大量时间,多以引入了多线程来爬取酒店的免费房信息,同时考虑到不要给服务器带来太大的负担,因此只是在一秒钟进行10个请求。