google_play_search 0.0.5 → 0.0.6
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 +7 -0
- data/lib/google_play_search/app.rb +3 -3
- data/lib/google_play_search/app_parser.rb +84 -46
- data/lib/google_play_search/search.rb +45 -45
- metadata +35 -59
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b4166b35ed26f6d6658a42b8de2e8b152788143f
|
4
|
+
data.tar.gz: ab3e879355c59c5c9247cea891af6899a0babb44
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2c64bf7eaa2d536f714293213015e50a150f26204b79c46e1ded793eb6c00af6088b5b10f3ad2127e256575169972140d0970852cd1ae625a5384fffc9efcb48
|
7
|
+
data.tar.gz: 225884c444c6c50b64c33ec81bab2bfd1405527d441c1387c8a23eae565e3cb2e241f9d1ce8a8900152ce447a908b0f30dfee1389f88cbdd185d94f88d1f4f3c
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module GooglePlaySearch
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
class App
|
3
|
+
attr_accessor :id, :name, :url, :developer, :category, :logo_url, :short_description, :rating, :reviews, :price
|
4
|
+
end
|
5
5
|
end
|
@@ -1,58 +1,71 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/app')
|
2
2
|
|
3
3
|
module GooglePlaySearch
|
4
|
-
|
5
|
-
|
4
|
+
class AppParser
|
5
|
+
SEARCH_APP_URL_END_SUFF = "&feature=search_result"
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
app_search_result_list << app
|
24
|
-
end
|
25
|
-
app_search_result_list
|
26
|
-
end
|
7
|
+
def initialize(content)
|
8
|
+
@doc = Nokogiri::HTML(content)
|
9
|
+
end
|
10
|
+
def parse
|
11
|
+
app_search_result_list = []
|
12
|
+
if @doc.css("li.search-results-item div.snippet").size > 0
|
13
|
+
@doc.css("li.search-results-item div.snippet").each do |app_content|
|
14
|
+
app_search_result_list << create_app(app_content)
|
15
|
+
end
|
16
|
+
else
|
17
|
+
@doc.css("li.z-last-child div.snippet").each do |app_content|
|
18
|
+
app_search_result_list << create_app(app_content)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
app_search_result_list
|
22
|
+
end
|
27
23
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
24
|
+
private
|
25
|
+
def get_url(app_content)
|
26
|
+
url = $GOOGLE_PLAY_STORE_BASE_URL + app_content.css("div.thumbnail-wrapper a").first['href']
|
27
|
+
if url.end_with?(SEARCH_APP_URL_END_SUFF)
|
28
|
+
url = url[0..-1* (SEARCH_APP_URL_END_SUFF.size + 1)]
|
29
|
+
end
|
30
|
+
url
|
31
|
+
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
def get_logo_url(app_content)
|
34
|
+
app_content.css("div.thumbnail-wrapper a.thumbnail img").first['src']
|
35
|
+
end
|
40
36
|
|
41
|
-
|
42
|
-
|
43
|
-
|
37
|
+
def get_name(app_content)
|
38
|
+
app_content.css("div.details a.title").first.content
|
39
|
+
end
|
44
40
|
|
45
|
-
|
46
|
-
|
47
|
-
|
41
|
+
def get_developer(app_content)
|
42
|
+
deleloper_contents_list = app_content.css("div.details div.attribution-category span.attribution a")
|
43
|
+
if deleloper_contents_list && deleloper_contents_list.size > 0
|
44
|
+
return deleloper_contents_list.first.content
|
45
|
+
else
|
46
|
+
deleloper_contents_single = app_content.css("div.details span.attribution a")
|
47
|
+
if deleloper_contents_single && deleloper_contents_single.size > 0
|
48
|
+
return deleloper_contents_single.first.content
|
49
|
+
end
|
50
|
+
end
|
51
|
+
return ""
|
52
|
+
end
|
48
53
|
|
49
|
-
|
50
|
-
|
51
|
-
|
54
|
+
def get_category(app_content)
|
55
|
+
category_contents = app_content.css("div.details div.attribution-category span.category a")
|
56
|
+
if category_contents && category_contents.size>0
|
57
|
+
return category_contents.first.content
|
58
|
+
end
|
59
|
+
return ""
|
60
|
+
end
|
52
61
|
|
53
|
-
|
54
|
-
|
55
|
-
|
62
|
+
def get_short_description(app_content)
|
63
|
+
description_contents = app_content.css("div.description")
|
64
|
+
if description_contents && description_contents.size > 0
|
65
|
+
return description_contents.first.content
|
66
|
+
end
|
67
|
+
return ""
|
68
|
+
end
|
56
69
|
|
57
70
|
def get_app_rating(app_content)
|
58
71
|
ratings = app_content.css("div.ratings")
|
@@ -71,5 +84,30 @@ module GooglePlaySearch
|
|
71
84
|
reviews.first.content[1..-2].gsub(',','').to_i
|
72
85
|
end
|
73
86
|
end
|
74
|
-
|
87
|
+
|
88
|
+
def get_app_price(app_content)
|
89
|
+
prices = app_content.css("span.buy-button-price")
|
90
|
+
if prices && prices.size > 0
|
91
|
+
if match = prices.first.content.match(/(.[0-9]*\.[0-9]+|[0-9]+) Buy/)
|
92
|
+
return match[1]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
return "0"
|
96
|
+
end
|
97
|
+
|
98
|
+
def create_app(app_content)
|
99
|
+
app = App.new
|
100
|
+
app.url = get_url app_content
|
101
|
+
app.id = app.url[app.url.index("?id=")+4..-1]
|
102
|
+
app.name = get_name app_content
|
103
|
+
app.price = get_app_price app_content
|
104
|
+
app.developer = get_developer app_content
|
105
|
+
app.category = get_category app_content
|
106
|
+
app.logo_url = get_logo_url app_content
|
107
|
+
app.short_description = get_short_description app_content
|
108
|
+
app.rating = get_app_rating app_content
|
109
|
+
app.reviews = get_app_reviews app_content
|
110
|
+
return app
|
111
|
+
end
|
112
|
+
end
|
75
113
|
end
|
@@ -5,51 +5,51 @@ require 'cgi'
|
|
5
5
|
require File.expand_path(File.dirname(__FILE__) + '/app_parser')
|
6
6
|
|
7
7
|
module GooglePlaySearch
|
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
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
8
|
+
class Search
|
9
|
+
attr_accessor :current_page, :keyword
|
10
|
+
|
11
|
+
$GOOGLE_PLAY_STORE_BASE_URL = "https://play.google.com"
|
12
|
+
|
13
|
+
GOOGLE_PLAY_BASE_SEARCH_URL = $GOOGLE_PLAY_STORE_BASE_URL + "/store/search?q="
|
14
|
+
|
15
|
+
DEFAULT_SEARCH_CONDITION = {:language => "en",
|
16
|
+
:category => "apps",
|
17
|
+
:per_page_num => 24,
|
18
|
+
:price => "0",
|
19
|
+
:safe_search => "0",
|
20
|
+
:sort_by => "1"}
|
21
|
+
|
22
|
+
def initialize(search_condition = DEFAULT_SEARCH_CONDITION)
|
23
|
+
@search_condition = DEFAULT_SEARCH_CONDITION.merge(search_condition)
|
24
|
+
@current_page = 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def search(keyword, options={})
|
28
|
+
@current_page = options[:page].nil? ? 1 : options[:page]
|
29
|
+
@keyword = keyword
|
30
|
+
stdin, stdout, stderr = Open3.popen3("curl '#{init_query_url}'")
|
31
|
+
AppParser.new(stdout.read).parse
|
32
|
+
end
|
33
|
+
|
34
|
+
def next_page()
|
35
|
+
@current_page = @current_page + 1
|
36
|
+
search @keyword, { :page => @current_page }
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def init_query_url
|
41
|
+
query_url = ""
|
42
|
+
query_url << GOOGLE_PLAY_BASE_SEARCH_URL
|
43
|
+
query_url << CGI.escape(@keyword) << "&"
|
44
|
+
query_url << "c=" << @search_condition[:category] << "&"
|
45
|
+
query_url << "hl=" << @search_condition[:language] << "&"
|
46
|
+
query_url << "price=" << @search_condition[:price] << "&"
|
47
|
+
query_url << "safe=" << @search_condition[:safe_search] << "&"
|
48
|
+
query_url << "sort=" << @search_condition[:sort_by] << "&"
|
49
|
+
start = (@current_page - 1) * @search_condition[:per_page_num]
|
50
|
+
query_url << "start=#{start}&num=#{@search_condition[:per_page_num]}"
|
51
|
+
end
|
52
|
+
end
|
53
53
|
end
|
54
54
|
|
55
55
|
|
metadata
CHANGED
@@ -1,84 +1,60 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: google_play_search
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 5
|
10
|
-
version: 0.0.5
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Grant Chen
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2012-06-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: nokogiri
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 5
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 5
|
32
|
-
- 3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
33
19
|
version: 1.5.3
|
34
20
|
type: :runtime
|
35
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.5.3
|
36
27
|
description: google play market search gem
|
37
28
|
email: kucss@hotmail.com
|
38
29
|
executables: []
|
39
|
-
|
40
30
|
extensions: []
|
41
|
-
|
42
31
|
extra_rdoc_files: []
|
43
|
-
|
44
|
-
|
45
|
-
- lib/google_play_search/app_parser.rb
|
32
|
+
files:
|
33
|
+
- lib/google_play_search.rb
|
46
34
|
- lib/google_play_search/search.rb
|
35
|
+
- lib/google_play_search/app_parser.rb
|
47
36
|
- lib/google_play_search/app.rb
|
48
|
-
|
49
|
-
homepage: https://github.com/kucss/google_play_search
|
37
|
+
homepage: https://github.com/grantchen/google_play_search
|
50
38
|
licenses: []
|
51
|
-
|
39
|
+
metadata: {}
|
52
40
|
post_install_message:
|
53
41
|
rdoc_options: []
|
54
|
-
|
55
|
-
require_paths:
|
42
|
+
require_paths:
|
56
43
|
- lib
|
57
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
none: false
|
68
|
-
requirements:
|
69
|
-
- - ">="
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
hash: 3
|
72
|
-
segments:
|
73
|
-
- 0
|
74
|
-
version: "0"
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
75
54
|
requirements: []
|
76
|
-
|
77
55
|
rubyforge_project:
|
78
|
-
rubygems_version:
|
56
|
+
rubygems_version: 2.0.0.rc.2
|
79
57
|
signing_key:
|
80
|
-
specification_version:
|
58
|
+
specification_version: 4
|
81
59
|
summary: google play market search
|
82
60
|
test_files: []
|
83
|
-
|
84
|
-
has_rdoc:
|