Class: Qunar::Rank

Inherits:
Object
  • Object
show all
Includes:
Capybara::DSL
Defined in:
lib/qunar/rank.rb

Instance Method Summary collapse

Constructor Details

#initialize(hotelId) ⇒ Rank

Returns a new instance of Rank.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/qunar/rank.rb', line 5

def initialize(hotelId)
  raise "id should be string" if !hotelId.instance_of?(String)
  Capybara.current_driver = :webkit   # :selenium/:poltergeist
  Capybara.default_selector = :xpath
  Capybara.app_host = 'http://hotel.qunar.com'

  # Header for webkit
  page.driver.header 'User-Agent', "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.77.4 (KHTML, like Gecko) Version/7.0.5 Safari/537.77.4"

  @HotelSEQ = hotelId   #hotelId is "cityurl_hotelcode"
  @cityurl, suffix, @hotelcode = hotelId.rpartition('_')
  @uri = URI(File.join('/city', @cityurl, "dt-#{@hotelcode}"))
  page.visit @uri

  limiter = 0
  begin
    page.all('//td[@class="book-ct"]//*[text()="展开报价"] | //td[@class="book-ct"]//*[text()="全部订完"]').each do |spage|
      puts 'cp 2-1'
      spage.click
      puts 'cp 2-2'
    end
    puts 'cp 3'
    # Expand hidden otas
    page.all("//div[@class='more-quote js-room-more']/a").each do |link|
      link.click
    end
  rescue =>e
    limiter+=1
    retry if limiter<3
    raise e
  end

  #@page = Capybara.current_session.driver.browser.page_source    #use when choose capybara driver selenium
  @hotel = Nokogiri::HTML page.html  #use when choose capybara driver webkit
end

Instance Method Details

#citynameCnObject

Get the Chinese name of the City



161
162
163
# File 'lib/qunar/rank.rb', line 161

def citynameCn
  page.evaluate_script("(function f() { return cityName; }());")
end

#cityNameEnObject

Get the English name of the City



166
167
168
# File 'lib/qunar/rank.rb', line 166

def cityNameEn
  page.evaluate_script("(function f() { return cityNameEn; }());")
end

#hotelInfoObject

Get the Hotel details



171
172
173
174
175
176
# File 'lib/qunar/rank.rb', line 171

def hotelInfo

  {  :hotel_id => @HotelSEQ, :hotel_name => self.name,
     :city => self.cityNameEn, :city_cn => self.citynameCn, 
     :star => self.star  }
end

#htmlObject

Html file



184
185
186
# File 'lib/qunar/rank.rb', line 184

def html
  @hotel
end

#nameObject

Get the Chinese name of the hotel



129
130
131
132
133
134
135
136
137
# File 'lib/qunar/rank.rb', line 129

def name         
  name  = @hotel.search("//div[@class='htl-info fr']//span")
  if name.empty?
    name = '该酒店不存在'
  else
    name = name.first.text.strip
  end
  return name
end

#roomsObject

Get the rooms details



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/qunar/rank.rb', line 42

def rooms
  rooms = []

  # room
  @hotel.search("//div[@id='roomTool']/div[@id='q-ra-1']/ul/li").each do |li|
    #puts 'one roomtype found'
    room = {}
    type = li.search("span[@class='type-name js-p-name']").first.text.strip
    room[:room_type] = type
    room[:otas] = []
    # ota
    li.search("div[@class='similar-type-agent-list']/div/div").each do |row|
      otas = {}

      ota = row.search("div[@class='profile-tit']").first
      ota = ota.text.strip
      otas[:ota] = ota

      bookable = row.search("a[@class='btn-book']/span")
      unless bookable.empty?
        bookable = bookable.first.text.strip
        if bookable == '订完'
          bookable = false
        else
          bookable = true
        end
      else
        bookable = true
      end
      otas[:bookable] = bookable

      insurance = row.search("a[@class='js-guarantee-plan']").first
      if insurance == nil
        insurance = false
      else
        insurance = true
      end
      otas[:safe] = insurance

      guarantee = row.search("cite[text()='需担保']").first
      if guarantee == nil
        guarantee = false
      else
        guarantee = true
      end
      otas[:guarantee] = guarantee

      coupon = row.search("span[@class='fan']/em[@class='pr']").first
      if coupon == nil
        coupon = 0
      else
        coupon = coupon.text.sub(/¥/,'').strip.to_i
      end
      otas[:coupon] = coupon
      
      reduce = row.search("span[@class='fan lapse']/em[@class='pr']").first
      if reduce == nil
        reduce = 0
      else
        reduce = reduce.text.sub(/¥/,'').strip.to_i
      end
      otas[:reduce] = reduce

      prepay = row.search("span[@title='需要预先支付房款']").first
      if prepay == nil
        prepay = false
      else
        prepay = true
      end
      otas[:prepay] = prepay


      price = row.search("p[@class='final-price ']/b").first.text.strip
      neat_price = row.search("p[@class='count_pr']").first.children[1].to_s

      otas[:original_price] = price.to_i
      otas[:final_price] = neat_price.to_i

      room[:otas] << otas
    end
    rooms << room
    
  end
  return rooms
end

#screen_shotObject

Get the screen_shot



179
180
181
# File 'lib/qunar/rank.rb', line 179

def screen_shot
  page.save_screenshot("#{Time.now}.png")
end

#starObject

Get the level of the hotel



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/qunar/rank.rb', line 140

def star         
  name_tag = @hotel.search('//div[@class="htl-info fr"]//em[@class="dangci"]').first
  return 0 if name_tag.nil?
  if name_tag.text.include?'经济型'
    1
  elsif name_tag.text.include?'舒适型'
    3
  elsif name_tag.text.include?'高档型'
    4
  elsif name_tag.text.include?'豪华型'
    5
  elsif name_tag.text.include?'star20'
    2
  elsif name_tag.text.include?'star50'
    5
  else
    0
  end
end