hotel_price 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/hotel_price.rb +3 -1
- data/lib/hotel_price/agoda/agoda_scraper.rb +2 -4
- data/lib/hotel_price/booking/booking_scraper.rb +3 -2
- data/lib/hotel_price/expedia/expedia_scraper.rb +4 -5
- data/lib/hotel_price/jalan/jalan_scraper.rb +5 -5
- data/lib/hotel_price/rakuten/rakuten_console.rb +1 -14
- data/lib/hotel_price/rakuten/rakuten_scraper.rb +13 -14
- data/lib/hotel_price/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8fd231f11180111d3ad02831039cb550616f229187d094904e319283ad5edddf
|
|
4
|
+
data.tar.gz: af6b0f219ea03e0e3ef0cf261eb8ea760cb3fadae129144c2512e631907c1bf6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b961c2ed9421d09648903cd4adc1c81fa42f88017361dca002e6e9d13c45baf7c51339dd38470062eec3b1257e8b2a4ad56f039cd2938af25110ebf351695ee0
|
|
7
|
+
data.tar.gz: d57619eb97f7fb8ad33d69ba22653201fe607f4ea81d7f65fd0a608e890339405511979538c243fc5b5ba151f553dbcf722c4261f034f0c3e9ef93b586861d41
|
data/Gemfile.lock
CHANGED
data/lib/hotel_price.rb
CHANGED
|
@@ -36,7 +36,7 @@ module HotelPrice
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
protected
|
|
40
40
|
|
|
41
41
|
def self.get_selenium_driver(mode = 0)
|
|
42
42
|
case mode
|
|
@@ -52,6 +52,8 @@ module HotelPrice
|
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
+
private
|
|
56
|
+
|
|
55
57
|
class Configuration
|
|
56
58
|
# Agoda API key
|
|
57
59
|
# @param [String]
|
|
@@ -2,12 +2,12 @@ require "date"
|
|
|
2
2
|
|
|
3
3
|
module HotelPrice::Agoda
|
|
4
4
|
class AgodaScraper
|
|
5
|
-
def self.get_price(agoda_hotel_id, checkin_date, num_adults)
|
|
5
|
+
def self.get_price(agoda_hotel_id, checkin_date, num_adults, mode = 0)
|
|
6
6
|
date = DateTime.now.strftime("%Y-%m-%d")
|
|
7
7
|
|
|
8
8
|
query_string = make_query_string(checkin_date.to_s, num_adults)
|
|
9
9
|
url = "https://www.agoda.com/ja-jp/#{agoda_hotel_id}.html?#{query_string}"
|
|
10
|
-
driver =
|
|
10
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
11
11
|
driver.get(url)
|
|
12
12
|
sleep 2
|
|
13
13
|
|
|
@@ -43,7 +43,5 @@ module HotelPrice::Agoda
|
|
|
43
43
|
return "" if num_adults.to_i <= 1
|
|
44
44
|
"adults=#{num_adults}"
|
|
45
45
|
end
|
|
46
|
-
|
|
47
|
-
|
|
48
46
|
end
|
|
49
47
|
end
|
|
@@ -2,12 +2,13 @@ require "date"
|
|
|
2
2
|
|
|
3
3
|
module HotelPrice::Booking
|
|
4
4
|
class BookingScraper
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
def self.get_price(booking_hotel_id, checkin_date, num_adults, mode = 0)
|
|
6
7
|
date = DateTime.now.strftime("%Y-%m-%d")
|
|
7
8
|
|
|
8
9
|
query_string = make_query_string(checkin_date.to_s, num_adults)
|
|
9
10
|
url = "https://www.booking.com/hotel/jp/#{booking_hotel_id}.ja.html?#{query_string}"
|
|
10
|
-
driver =
|
|
11
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
11
12
|
driver.get(url)
|
|
12
13
|
sleep 2
|
|
13
14
|
|
|
@@ -2,12 +2,12 @@ require "date"
|
|
|
2
2
|
|
|
3
3
|
module HotelPrice::Expedia
|
|
4
4
|
class ExpediaScraper
|
|
5
|
-
def self.get_price(expedia_hotel_id, checkin_date, num_adults)
|
|
5
|
+
def self.get_price(expedia_hotel_id, checkin_date, num_adults, mode = 0)
|
|
6
6
|
date = DateTime.now.strftime("%Y-%m-%d")
|
|
7
7
|
|
|
8
8
|
query_string = make_query_string(checkin_date.to_s, num_adults)
|
|
9
9
|
url = "https://www.expedia.co.jp/ja/#{expedia_hotel_id}.Hotel-Information?#{query_string}"
|
|
10
|
-
driver =
|
|
10
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
11
11
|
driver.get(url)
|
|
12
12
|
sleep 2
|
|
13
13
|
|
|
@@ -32,12 +32,11 @@ module HotelPrice::Expedia
|
|
|
32
32
|
"#{cd_args}&#{na_args}&x_pwa=1&rfrr=HSR&pwa_ts=1583335742618&swpToggleOn=true®ionId=3250&destination=Sapporo%2C+Hokkaido%2C+Japan&destType=MARKET&neighborhoodId=6290332&selected=5224778&sort=recommended&top_dp=5686&top_cur=JPY"
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
|
|
36
35
|
def self.make_date_args checkin_date
|
|
37
36
|
Date.parse checkin_date rescue return ""
|
|
38
37
|
t = Date.parse(checkin_date)
|
|
39
38
|
checkin_arg = t.strftime("chkin=%Y-%m-%d")
|
|
40
|
-
checkout_arg = (t+1).strftime("chkout=%Y-%m-%d")
|
|
39
|
+
checkout_arg = (t + 1).strftime("chkout=%Y-%m-%d")
|
|
41
40
|
"#{checkin_arg}&#{checkout_arg}"
|
|
42
41
|
end
|
|
43
42
|
|
|
@@ -46,4 +45,4 @@ module HotelPrice::Expedia
|
|
|
46
45
|
"rm1=a#{num_adults}"
|
|
47
46
|
end
|
|
48
47
|
end
|
|
49
|
-
end
|
|
48
|
+
end
|
|
@@ -6,7 +6,7 @@ module HotelPrice::Jalan
|
|
|
6
6
|
query_string = make_query_string(checkin_date.to_s, num_adults)
|
|
7
7
|
url = "https://www.jalan.net/yad#{jalan_hotel_id}/plan/?screenId=UWW3101&yadNo=#{jalan_hotel_id}&#{query_string}"
|
|
8
8
|
puts url
|
|
9
|
-
driver =
|
|
9
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
10
10
|
driver.get(url)
|
|
11
11
|
sleep 2
|
|
12
12
|
@price_box = []
|
|
@@ -20,11 +20,11 @@ module HotelPrice::Jalan
|
|
|
20
20
|
room_name: e.find_element(class_name: "p-searchResultItem__planName").text,
|
|
21
21
|
plan_name: f.find_element(class_name: "p-planCassette__header").text
|
|
22
22
|
}
|
|
23
|
-
rescue
|
|
23
|
+
rescue StandardError
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
|
-
@price_box.sort_by { |
|
|
27
|
-
rescue
|
|
26
|
+
@price_box.sort_by { |_a, _b, c| c }.reverse.first
|
|
27
|
+
rescue StandardError
|
|
28
28
|
{ date: date, min_price: 0 }
|
|
29
29
|
end
|
|
30
30
|
|
|
@@ -44,4 +44,4 @@ module HotelPrice::Jalan
|
|
|
44
44
|
"adultNum=#{num_adults}"
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
|
-
end
|
|
47
|
+
end
|
|
@@ -9,7 +9,7 @@ module HotelPrice::Rakuten
|
|
|
9
9
|
mode: params[:mode] ||= 0
|
|
10
10
|
}
|
|
11
11
|
@wait = Selenium::WebDriver::Wait.new(timeout: 100)
|
|
12
|
-
@driver = get_selenium_driver @config[:mode]
|
|
12
|
+
@driver = self.get_selenium_driver @config[:mode]
|
|
13
13
|
if @config[:chain]
|
|
14
14
|
go_to_management_page_chain
|
|
15
15
|
else
|
|
@@ -17,19 +17,6 @@ module HotelPrice::Rakuten
|
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
def get_selenium_driver(mode = 0)
|
|
21
|
-
if mode == 1
|
|
22
|
-
firefox_capabilities = Selenium::WebDriver::Remote::Capabilities.firefox
|
|
23
|
-
Selenium::WebDriver.for(:remote, url: "http://selenium-hub:4444/wd/hub", desired_capabilities: firefox_capabilities)
|
|
24
|
-
elsif mode == 2
|
|
25
|
-
Selenium::WebDriver.for :firefox
|
|
26
|
-
else
|
|
27
|
-
options = Selenium::WebDriver::Firefox::Options.new
|
|
28
|
-
options.add_argument("-headless")
|
|
29
|
-
Selenium::WebDriver.for :firefox, options: options
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
20
|
def go_to_management_page_chain
|
|
34
21
|
@driver.get "https://manage.travel.rakuten.co.jp/portal/inn/ry_group.main"
|
|
35
22
|
@driver.find_element(:name, "f_id").send_keys @config[:login_id].to_s
|
|
@@ -8,7 +8,7 @@ module HotelPrice::Rakuten
|
|
|
8
8
|
|
|
9
9
|
query_string = make_query_string(checkin_date.to_s, num_adults)
|
|
10
10
|
url = "https://hotel.travel.rakuten.co.jp/hotelinfo/plan/#{rakuten_hotel_id}?#{query_string}"
|
|
11
|
-
driver =
|
|
11
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
12
12
|
driver.get(url)
|
|
13
13
|
sleep 2
|
|
14
14
|
driver.find_elements(class_name: "planThumb").first rescue return ""
|
|
@@ -18,7 +18,7 @@ module HotelPrice::Rakuten
|
|
|
18
18
|
room_name = first_plan.find_element(tag_name: "h6").text
|
|
19
19
|
plan_name = first_plan.find_element(tag_name: "h4").text
|
|
20
20
|
{ date: date, min_price: price, hotel_name: hotel_name, room_name: room_name, plan_name: plan_name }
|
|
21
|
-
rescue
|
|
21
|
+
rescue StandardError
|
|
22
22
|
{ date: date, min_price: 0 }
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -41,10 +41,9 @@ module HotelPrice::Rakuten
|
|
|
41
41
|
"f_otona_su=#{num_adults}&f_kin2=0&f_kin=&f_s1=0&f_s2=0&f_y1=0&f_y2=0&f_y3=0&f_y4=0"
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
|
|
45
44
|
def self.review rakuten_hotel_id, mode = 0
|
|
46
|
-
driver =
|
|
47
|
-
driver.get("https://travel.rakuten.co.jp/HOTEL/#{rakuten_hotel_id
|
|
45
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
46
|
+
driver.get("https://travel.rakuten.co.jp/HOTEL/#{rakuten_hotel_id}/review.html")
|
|
48
47
|
sleep 2
|
|
49
48
|
comment_area = driver.find_elements(:class_name, "commentBox")
|
|
50
49
|
data = comment_area.map do |f|
|
|
@@ -53,12 +52,12 @@ module HotelPrice::Rakuten
|
|
|
53
52
|
generation = 0
|
|
54
53
|
gender = ""
|
|
55
54
|
else
|
|
56
|
-
username = f.find_element(class_name: "user").text.match(/(^.+ )/).to_s.strip
|
|
57
|
-
generation = f.find_element(class_name: "user").text.match(/\[.+代/).to_s.gsub("[","").gsub("代", "")
|
|
55
|
+
username = f.find_element(class_name: "user").text.match(/(^.+ )/).to_s.strip
|
|
56
|
+
generation = f.find_element(class_name: "user").text.match(/\[.+代/).to_s.gsub("[", "").gsub("代", "")
|
|
58
57
|
gender = f.find_element(class_name: "user").text.match(/\/../).to_s.gsub("/", "")
|
|
59
58
|
end
|
|
60
59
|
{
|
|
61
|
-
date: f.find_element(class_name: "time").text.gsub("年","").gsub("月", "").gsub("日", ""),
|
|
60
|
+
date: f.find_element(class_name: "time").text.gsub("年", "").gsub("月", "").gsub("日", ""),
|
|
62
61
|
rate: f.find_element(class_name: "rate").text,
|
|
63
62
|
username: username,
|
|
64
63
|
generation: generation,
|
|
@@ -72,7 +71,7 @@ module HotelPrice::Rakuten
|
|
|
72
71
|
end
|
|
73
72
|
|
|
74
73
|
def self.get_photo_num rakuten_hotel_id, mode = 0
|
|
75
|
-
driver =
|
|
74
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
76
75
|
driver.get "https://hotel.travel.rakuten.co.jp/hinfo/#{rakuten_hotel_id}/"
|
|
77
76
|
sleep 2
|
|
78
77
|
num = driver.find_element(:id, "navPht").text.gsub("写真・動画(", "").gsub(")", "").to_i
|
|
@@ -81,7 +80,7 @@ module HotelPrice::Rakuten
|
|
|
81
80
|
end
|
|
82
81
|
|
|
83
82
|
def self.get_bf_plan_num rakuten_hotel_id, mode = 0
|
|
84
|
-
driver =
|
|
83
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
85
84
|
driver.get "https://hotel.travel.rakuten.co.jp/hotelinfo/plan/#{rakuten_hotel_id}"
|
|
86
85
|
driver.find_element(:id, "focus1").click
|
|
87
86
|
driver.find_element(:id, "dh-squeezes-submit").click
|
|
@@ -92,7 +91,7 @@ module HotelPrice::Rakuten
|
|
|
92
91
|
end
|
|
93
92
|
|
|
94
93
|
def self.get_dayuse_plan_num rakuten_hotel_id, mode = 0
|
|
95
|
-
driver =
|
|
94
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
96
95
|
driver.get "https://hotel.travel.rakuten.co.jp/hotelinfo/plan/#{rakuten_hotel_id}"
|
|
97
96
|
sleep 10
|
|
98
97
|
driver.find_element(:id, "du-radio").click
|
|
@@ -104,17 +103,17 @@ module HotelPrice::Rakuten
|
|
|
104
103
|
end
|
|
105
104
|
|
|
106
105
|
def self.get_detail_class_code rakuten_hotel_id, mode = 0
|
|
107
|
-
driver =
|
|
106
|
+
driver = HotelPrice.get_selenium_driver mode
|
|
108
107
|
driver.get "https://hotel.travel.rakuten.co.jp/hinfo/?f_no=#{rakuten_hotel_id}"
|
|
109
108
|
{
|
|
110
109
|
status: "found",
|
|
111
110
|
detail_class_code: driver.find_element(id: "breadcrumbs-detail").attribute("href").match(/\/.\./).to_s.gsub("/", "").gsub(".", "")
|
|
112
111
|
}
|
|
113
|
-
rescue
|
|
112
|
+
rescue StandardError
|
|
114
113
|
{
|
|
115
114
|
status: "not_found",
|
|
116
115
|
detail_class_code: ""
|
|
117
116
|
}
|
|
118
117
|
end
|
|
119
118
|
end
|
|
120
|
-
end
|
|
119
|
+
end
|
data/lib/hotel_price/version.rb
CHANGED