Python爬取携程网酒店价格信息案例

最近研究了一下怎么利用Python爬虫来爬取携程网的酒店价格信息,研究几天之后发现有一定的难度,不能用简单的静态网页爬虫来爬取到信息,注意原因在于输入项太多,拼URL的时候发现城市名字后面都带数字的,而这个数字有点莫名其妙,例如我查看的时候发现大连酒店的查询URL就是Dalian6,而沈阳就搞出了一个Shenyang451,不知道什么时候就会变,由于不知道携程网定义的逻辑,只能使用动态网页爬虫的方式来爬取信息。

动态爬虫的一种实现方法就是使用Selenium,不想在明面上显示页面的,就用webdriver.PhantomJS来访问携程网每个要爬取信息的酒店URL,这个URL相对稳定不变,只要给出这个酒店URL列表,就可使用Selenium Webdriver的方式来访问这些地址并从网页上爬取需要的信息,需要什么信息只要网页上有的都可以爬下来。

程序实现逻辑简单,直接上代码(23行代码):

#author: hanshiqiang365

import sys

import urllib

from selenium import webdriver

urls=['http://hotels.ctrip.com/hotel/400693.html?ctm_ref=hod_sr_lst_dl_n_1_11',

'http://hotels.ctrip.com/hotel/433189.html?ctm_ref=hod_sr_lst_dl_n_1_17',

'http://hotels.ctrip.com/hotel/400950.html?ctm_ref=hod_sr_lst_dl_n_1_13']

def write_txt_file(path, txt):

with open(path, 'a', encoding='utf-8', newline='') as f:

f.write(txt)

class Xc():

def ctrip_hotel_price(seif):

for url in urls:

driver = webdriver.PhantomJS()

driver.get(url)

hotelname=driver.find_element_by_class_name('cn_n').text

fangx_1=driver.find_element_by_class_name('room_unfold').text.split('\n')[0]

jiage_1=driver.find_element_by_class_name('base_price').text

json_text=driver.find_element_by_xpath('//*[@id="htl_detail_htl_hotel"]').get_attribute('value')

driver.quit

write_txt_file('ctrip-hotel_price.txt', hotelname+'|'+fangx_1+'|'+jiage_1 + '\r\n')

write_txt_file('ctrip-hotel_price.txt', json_text + '\r\n')

s=Xc()

s.ctrip_hotel_price()

程序运行结束后,打开生成的TEXT文本文件就可以看到结果:

利用Selenium Webdriver来实现的动态网页爬虫有一个缺点,就是一个字“慢”!尽管已经采用webdriver.PhantomJS这种不需要在明面上打开浏览器运行的实现模式,性能上还是和Python利用request实现的静态网页爬虫相差甚远。这是由爬取携程网房价信息这种业务需求和利用Selenium来实现动态网页爬虫这种技术实现方式两者相互作用决定的。

从测试效果上而言,从携程网上爬取酒店房价信息的业务目的还是可以实现的。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180530G0B9JI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券