HTTP抓包和Python爬虫获取7天酒店免费房信息

抓包软件:Fiddler
Python模块:requests、SQLite
 
一、准备工作
安装Fiddler、设置教程参考:
http://jingyan.baidu.com/article/03b2f78c7b6bb05ea237aed2.html
http://www.cnblogs.com/wakey/p/4244301.html
为了方便 建议设置filters中Host为 trip.plateno.com
 
点击订酒店就会发现如下的包被抓取:

其中必要重要的一个包是/hotel/query/ota/basic的这个包。
其发送的JSON为:

其中需要关注的几个值分别是:

  • token:这个值需要自己抓包来获取,具体生成机制不明,但是很久都不会变。
  • checkInDatecheckOutDate分别是入住和离店时间的时间戳,在爬虫中可以用time.time()来生成。
  • city就是utf-8编码的城市名,cityCode也需要抓包获得。

接收到的JSON为:

其中data存储了每个酒店的一些基本信息,点开可以获得,此处需要关注的值是:

  • hotelSum指出查询的城市的酒店数量
  • data中获取chainCodeinnName分别就是酒店的编号和酒店名。

然后,随便点开一家7天酒店,关注/hotel/roomStatus这个包

需要关注的值是:

  • token同上
  • beginDateendDate同样是时间戳
  • chainID 和上文中的chainCode相同,都是酒店的编号

至于积分免费房的信息的具体位置,就在返回的JSON中,通过如下的解析判断方式可以获得免费房信息,其中hotel就是返回的JSON字符串经过loads后的字典。

def can_book_free_room(hotel):
    for i in hotel['result']['data']:
        # 自主大床房
        if i['roomTypeId'] == '220':
            for j in i['roomStatusList'][0]['roomRates']:
                # 积分免费房
                if j['actLabel'] == u'2000积分免费房':
                    if j['canBooking']:
                        return True
    else:
        return False

此时也就完成了所有的准备工作,获取了所有需要的url、request的body及其参数。

二、爬虫编写
因为代码较长,故不在此放出,请移步github:
https://github.com/HortonHu/7days_free_room
下载后需要在项目中新建一个token.ini配置文件,内容是:

[room]
room_token=***上述步骤中第一个token***
[hotel]
hotel_token=***上述步骤中第二个token***

代码主要分为两个文件:

运行hotel.py获得指定城市的所有7天酒店列表,用SQLite进行存储,因为每个城市只需要最多几次的请求,所以没有引入多线程。
运行示例如图:

数据库中将存储如下数据。其中其中free_room指的是酒店是否有免费房,默认是0,提供则为1。

运行room.py获得指定城市所有酒店的免费房状态。其中city指定了城市,days指定了查询日期距离当天的天数,例如查询当天信息则为0。

因为一个城市中需要查询的酒店数量在几十个左右,网络IO占据了大量时间,多以引入了多线程来爬取酒店的免费房信息,同时考虑到不要给服务器带来太大的负担,因此只是在一秒钟进行10个请求。

运行示例如下:

更新与:2016年8月5日17:34:35
服务器对于同一IP的大量访问会封IP,因此加入了代理。
目前使用的是VPN,下一步目标是从IP代理网站爬取代理IP,维护一个代理IP池进行代理。

posted @ 2016-08-04 16:53  水域净土  阅读(1245)  评论(0)    收藏  举报