google_play_search 0.0.24 → 0.0.25
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 +5 -5
- data/lib/google_play_search/app_parser.rb +20 -85
- data/lib/google_play_search/search.rb +19 -18
- metadata +3 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: c24b22dfdda221dc7ea339cf1ce3c48c67bbcdf9742de27e29d64a9d20312ed6
|
|
4
|
+
data.tar.gz: 3a55d8a6a4190c17b64b774501de9f6514a4f3f23f5c107b1e403f756b3226f6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e5cb795b237bf3b1ff34054ddf1add01becc579171b9f04604c0e19e5151fff113b6a33b65c506891cfa85287519c78b2eac1534a12da92a31567f797d2e839a
|
|
7
|
+
data.tar.gz: 70819cf4e15cff9bc2eda06c2b7e22ec86284cd98bf92ae0463b4627b2b4fbad0f6f57acb54a66cea07cd6630e6551fd05a40637ce4aaa4971f032ea6aa80e74
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) +
|
|
2
|
-
require File.expand_path(File.dirname(__FILE__) +
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/app")
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/utils")
|
|
3
|
+
require "json"
|
|
3
4
|
|
|
4
5
|
module GooglePlaySearch
|
|
5
6
|
class AppParser
|
|
@@ -8,99 +9,33 @@ module GooglePlaySearch
|
|
|
8
9
|
SEARCH_APP_URL_END_SUFF = "&feature=search_result"
|
|
9
10
|
|
|
10
11
|
def initialize(content)
|
|
11
|
-
@
|
|
12
|
+
@content = content
|
|
12
13
|
end
|
|
14
|
+
|
|
13
15
|
def parse
|
|
14
16
|
app_search_result_list = []
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
app_search_result_list << create_app(app_content)
|
|
22
|
-
end
|
|
17
|
+
content = @content.match(
|
|
18
|
+
/>AF_initDataCallback\({key: 'ds:3'.*{return(?<data>[\s\S]*?)}}\)\;<\/script/
|
|
19
|
+
)[:data]
|
|
20
|
+
data = JSON.parse(content)
|
|
21
|
+
data[0][1][0][0][0].each do |app|
|
|
22
|
+
app_search_result_list << create_app(app)
|
|
23
23
|
end
|
|
24
24
|
app_search_result_list
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
private
|
|
28
|
-
def get_url(app_content)
|
|
29
|
-
url = $GOOGLE_PLAY_STORE_BASE_URL + app_content.css("a.card-click-target").first['href']
|
|
30
|
-
if url.end_with?(SEARCH_APP_URL_END_SUFF)
|
|
31
|
-
url = url[0..-1* (SEARCH_APP_URL_END_SUFF.size + 1)]
|
|
32
|
-
end
|
|
33
|
-
url
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def get_logo_url(app_content)
|
|
37
|
-
add_http_prefix(app_content.css("img.cover-image").first['src'])
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def get_name(app_content)
|
|
41
|
-
app_content.css("a.title").first.content.strip
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def get_developer(app_content)
|
|
45
|
-
deleloper_contents_list = app_content.css("div.subtitle-container a.subtitle")
|
|
46
|
-
if deleloper_contents_list && deleloper_contents_list.size > 0
|
|
47
|
-
return deleloper_contents_list.first.content
|
|
48
|
-
else
|
|
49
|
-
deleloper_contents_single = app_content.css("div.details span.attribution a")
|
|
50
|
-
if deleloper_contents_single && deleloper_contents_single.size > 0
|
|
51
|
-
return deleloper_contents_single.first.content
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
return ""
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def get_category(app_content)
|
|
58
|
-
category_contents = app_content.css("div.attribution-category span.category a")
|
|
59
|
-
if category_contents && category_contents.size>0
|
|
60
|
-
return category_contents.first.content
|
|
61
|
-
end
|
|
62
|
-
return ""
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def get_short_description(app_content)
|
|
66
|
-
description_contents = app_content.css("div.description")
|
|
67
|
-
if description_contents && description_contents.size > 0
|
|
68
|
-
return description_contents.first.content.strip
|
|
69
|
-
end
|
|
70
|
-
return ""
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def get_app_rating(app_content)
|
|
74
|
-
ratings = app_content.css("div.current-rating")
|
|
75
|
-
if ratings && ratings.first
|
|
76
|
-
rating_str = ratings.first['style']
|
|
77
|
-
unless rating_str.empty?
|
|
78
|
-
return rating_str[/\d+\.?\d?/].to_f / 100 * 5
|
|
79
|
-
end
|
|
80
|
-
return 0
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def get_app_price(app_content)
|
|
85
|
-
prices = app_content.css("span.price-container button.price span")
|
|
86
|
-
if prices and prices.first
|
|
87
|
-
if match = prices.first.content.match(/(.[0-9]*\.[0-9]+|[0-9]+)/)
|
|
88
|
-
return match[1]
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
return "0"
|
|
92
|
-
end
|
|
93
28
|
|
|
94
|
-
def create_app(
|
|
29
|
+
def create_app(app_json)
|
|
95
30
|
app = App.new
|
|
96
|
-
app.url =
|
|
97
|
-
app.id =
|
|
98
|
-
app.name =
|
|
99
|
-
app.price =
|
|
100
|
-
app.developer =
|
|
101
|
-
app.logo_url =
|
|
102
|
-
app.short_description =
|
|
103
|
-
app.rating =
|
|
31
|
+
app.url = "https://play.google.com" + app_json[9][4][2]
|
|
32
|
+
app.id = app_json[12][0]
|
|
33
|
+
app.name = app_json[2]
|
|
34
|
+
app.price = app_json[7][0][3][2][1][0][2] if app_json[7].size > 0 && app_json[7][0][3]
|
|
35
|
+
app.developer = app_json[4][0][0][0]
|
|
36
|
+
app.logo_url = app_json[1][1][0][3][2]
|
|
37
|
+
app.short_description = app_json[4][1][1][1][1]
|
|
38
|
+
app.rating = app_json[6][0][2][1][0] if app_json[6].size > 0
|
|
104
39
|
return app
|
|
105
40
|
end
|
|
106
41
|
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
3
|
-
require
|
|
4
|
-
require
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "nokogiri"
|
|
3
|
+
require "cgi"
|
|
4
|
+
require "httpclient"
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + "/app_parser")
|
|
5
6
|
|
|
6
7
|
module GooglePlaySearch
|
|
7
8
|
class Search
|
|
@@ -11,10 +12,10 @@ module GooglePlaySearch
|
|
|
11
12
|
|
|
12
13
|
GOOGLE_PLAY_BASE_SEARCH_URL = $GOOGLE_PLAY_STORE_BASE_URL + "/store/search"
|
|
13
14
|
|
|
14
|
-
DEFAULT_SEARCH_CONDITION = {:language => "en",
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
DEFAULT_SEARCH_CONDITION = { :language => "en",
|
|
16
|
+
:category => "apps",
|
|
17
|
+
:price => "0",
|
|
18
|
+
:rating => "0" }
|
|
18
19
|
|
|
19
20
|
def initialize(search_condition = DEFAULT_SEARCH_CONDITION)
|
|
20
21
|
@search_condition = DEFAULT_SEARCH_CONDITION.merge(search_condition)
|
|
@@ -22,10 +23,9 @@ module GooglePlaySearch
|
|
|
22
23
|
@current_page = 1
|
|
23
24
|
end
|
|
24
25
|
|
|
25
|
-
def search(keyword, options={})
|
|
26
|
+
def search(keyword, options = {})
|
|
26
27
|
@keyword = keyword
|
|
27
28
|
page = HTTPClient.new.get(GOOGLE_PLAY_BASE_SEARCH_URL, query_params).body
|
|
28
|
-
get_next_page_token(page)
|
|
29
29
|
AppParser.new(page).parse
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -35,18 +35,19 @@ module GooglePlaySearch
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
private
|
|
38
|
+
|
|
38
39
|
def query_params
|
|
39
40
|
params = {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
"q" => @keyword,
|
|
42
|
+
"c" => @search_condition[:category],
|
|
43
|
+
"hl" => @search_condition[:language],
|
|
44
|
+
"price" => @search_condition[:price],
|
|
45
|
+
"rating" => @search_condition[:rating],
|
|
46
|
+
"start" => 0,
|
|
47
|
+
"num" => 0,
|
|
47
48
|
}
|
|
48
49
|
if @next_page_token
|
|
49
|
-
params[
|
|
50
|
+
params["pagTok"] = @next_page_token
|
|
50
51
|
end
|
|
51
52
|
params
|
|
52
53
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: google_play_search
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.25
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Grant Chen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-01-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: nokogiri
|
|
@@ -125,8 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
125
125
|
- !ruby/object:Gem::Version
|
|
126
126
|
version: '0'
|
|
127
127
|
requirements: []
|
|
128
|
-
|
|
129
|
-
rubygems_version: 2.5.1
|
|
128
|
+
rubygems_version: 3.0.3
|
|
130
129
|
signing_key:
|
|
131
130
|
specification_version: 4
|
|
132
131
|
summary: google play market search
|