最近研究了一下怎么利用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来实现动态网页爬虫这种技术实现方式两者相互作用决定的。
从测试效果上而言,从携程网上爬取酒店房价信息的业务目的还是可以实现的。
领取专属 10元无门槛券
私享最新 技术干货