Pyhton携程上酒店每个房型价钱详细的爬虫

最近由于工作需要,做了一个携程酒店的爬虫,初步达到了一些成果。
由于python是半路出家(之前笔者是学习java的,并且现在也一直在学习。),在把项目分
享出来看能否给网友们一些帮助的同时,也希望有大佬帮我改进改进。
废话说的过多,直接上货。


Pyhton携程上酒店每个房型价钱详细的爬虫_第1张图片
感觉爬虫和侦探进行破案有点类似,一点一点线索抽茧剥丝

  • 首先看按照地市搜索的url
    https://hotels.ctrip.com/hotel/hangzhou17#ctm_ref=hod_hp_sb_lst
    分析可得会地市不一样的话只是在上述链接中 hangzhouo17 部分发生改变,杭州倒是看得懂,不过后面的17是什么鬼,F12看请求,发现了这一个 Pyhton携程上酒店每个房型价钱详细的爬虫_第2张图片
    这里就有地市字母和数字的联系,但是仍然不知道对应关系是啥,知其然不知其所以然,那不管了,拿到再说。

  • 分析分页的url
    查看network页面,可以看到在HeaderForm Data里带有请求参数,而且这是一个POST请求,那么分析可得分页代码如下
    Pyhton携程上酒店每个房型价钱详细的爬虫_第3张图片
# for num in range(1,page_size): #这里是循环所有的分页,因为数据量过大,先就意思一下
 # 只拿到第一页
num = 1
cityid = 17
# 拼接url   cityid为杭州对应的id,这里只需要数字,不需要字母
hotel_list_page_url =  'https://hotels.ctrip.com/Domestic/Tool/AjaxHotelList.aspx?cityId='+str(cityid) +'&&page='+str(num)'
result = requests.get(hotel_url, headers=getHeader())
 result.encoding = 'utf-8'
 print(result.text)

然后看一下输出的result,
Pyhton携程上酒店每个房型价钱详细的爬虫_第4张图片
就这么神奇,发现请求回来的json格式数据中,有一个hotelpositionJSON就是我们需要的东西,那么解析页面啥的,可以,但没必要。其实里面还有更多的东西,例如hotelMapStreetJSON的数据,看起来就是酒店对应的经纬度

listdata = json.loads(fixed) 
# 对数据进行json解析,然后直接拿到hotelPositionJSON系列数据
hotelPosition = listdata['hotelPositionJSON'] 
for hotel in hotelPosition:
	hotel_data = {} # 创建一个列表来储存酒店的基本信息
	hotel_data['name'] = hotel_info['name']  # 酒店名称
    hotel_data['address'] = hotel_info['address']  # 酒店地址
    hotel_data['score'] = hotel_info['score']  # 酒店评分
    hotel_data['stardesc'] = hotel_info['stardesc']  # 酒店评分描述
	hotel_data['url'] = hotel['url']  # 进入酒店详情页的url后缀

好了,至此案件破解的十分顺利,那么继续破案,真相只有一个!


  • 开始进入酒店详情页
    分析可得酒店详情页就是’https://hotels.ctrip.com’加上上述的url后缀
    Pyhton携程上酒店每个房型价钱详细的爬虫_第5张图片
    一看到这个给力加载中,就知道是动态页面加载了,直接去F12查看吧。
    找到了一个超级可疑的嫌疑人,
    Pyhton携程上酒店每个房型价钱详细的爬虫_第6张图片
    前面有一大串花里胡哨的乱码中文,不管,透过现象看本质,发现有个html的数据很有嫌疑,分析重构这个请求,于是乎…
 startDate = datetime.date.today()
 oneday = datetime.timedelta(days=1)
 depDate = startDate + oneday
 hotel_url1 = 'https://hotels.ctrip.com/Domestic/tool/AjaxHote1RoomListForDetai1.aspx?MasterHotelID='
 hotel_url2 = '&hotel='
 hotel_url3 = '&city='
 hotel_url4 = '&startDate='
 hotel_url5 = '&depDate='
 # 分析发现ajax的请求可以通过这个链接拿到(postman是个好东西)
 hotel_final_url = hotel_url1 + str(hotelId) + hotel_url2 + str(hotelId) + hotel_url3 \
                      + str(cityId) + hotel_url4 + str(startDate) + hotel_url5 + str(depDate)
hotel_xba = requests.get(hotel_final_url, headers=hotelHead)
data = json.loads(hotel_xba.text)
print(data['html'])

顺利拿到,一路顺利的有点得意忘形,中间的辛酸苦楚也就自己知道了 T T
接着来吧。。

hotel_detail_html = etree.HTML(data['html'])
room_info = {}
room_name = hotel_tr.xpath('td[1]/a[2]')[0].text   # 房间名
room_type = hotel_tr.xpath('td[2]/span[1]/text()')[0] # 房间类型
bed_type = hotel_tr.xpath('td[3]/text()')[0] # 床型
breakfast_type = hotel_tr.xpath('td[4]/text()')[0] # 早餐类型
per_price = hotel_tr.xpath('td[2]/@data-price')[0] # 原先价钱
room_discount_text = hotel_tr.xpath('td[8]/div/div[2]/span/text()')[0]
room_discount_price = regex.sub('\D', '', room_discount_text) # 优惠价钱
rel_price = int(per_price) - int(room_discount_price) # 实际价钱

好了,至此拿到了所需要的所有信息。
跑程序结果如下。
Pyhton携程上酒店每个房型价钱详细的爬虫_第7张图片
后面创建了两张表来持久化这些数据,
一张酒店表记录酒店的一些信息。
Pyhton携程上酒店每个房型价钱详细的爬虫_第8张图片
一张房间信息表来记录各个房型的价钱等
Pyhton携程上酒店每个房型价钱详细的爬虫_第9张图片


注:有些情况需要处理,因为数据量过大,导致程序运行时间太长。而且在运行一定时间后会遇到携程的反爬机制。还有在找一些信息的时候,有些会没有,这样的话需要去做一个判断等,程序还是有较多问题的,代码完整版到时候我贴上GitHub的地址。
GitHub地址:https://github.com/geeemini/XCSpider
GitHub超萌新感觉不会用鸭。。

你可能感兴趣的:(Python爬虫)