outscraper 0.1.4 → 0.3.0
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/CHANGELOG.md +1 -1
- data/examples/Google Maps Reviews.md +5 -0
- data/examples/Google Maps.md +1 -0
- data/lib/outscraper/version.rb +1 -1
- data/lib/outscraper.rb +255 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8ed0f66bc6d7aef0b43b7288be4e238375c6272df9f7027c9aad861bfde504b
|
4
|
+
data.tar.gz: 1597732b9ae976053e26571781cecd3ddc1c15c02337540c44bac0e37df39996
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2189e4f1b9a57e0d59076b956af19c60fe328b497908ee480cbd7b012f0bf8d70c89b63224ee377f5bf7b62efb4fe2198961a87a07e7b5dd6be19ee48f885891
|
7
|
+
data.tar.gz: 1fd22a5487adcd398cb779f629ae793ed55c3575b7a1b96851714882427c71705f92e5d09e6cc4a565259ad25e3d373d4c9512a84f503312368d2b8b172d5916
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# Google Maps Reviews Scraper With Ruby
|
2
2
|
|
3
3
|
The library provides real-time access to the reviews from Google Maps via [Outscraper API](https://app.outscraper.com/api-docs#tag/Google-Reviews).
|
4
|
+
It allows scraping all the reviews from any place on Google Maps within seconds.
|
5
|
+
|
6
|
+
- Not limited to the official Google API limit of 5 reviews per a place
|
7
|
+
- Real time data scraping with response time less than 3s
|
8
|
+
- Sort, skip, ignore, cutoff, and other advanced parameters
|
4
9
|
|
5
10
|
## Installation
|
6
11
|
|
data/examples/Google Maps.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Google Maps Scraper With Ruby
|
2
2
|
|
3
3
|
The library provides real-time access to the places from Google Maps via [Outscraper API](https://app.outscraper.com/api-docs#tag/Google-Maps).
|
4
|
+
It allows easy scraping of [businesses information](https://outscraper.com/google-maps-scraper/#dictionary) from Google Maps.
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
data/lib/outscraper/version.rb
CHANGED
data/lib/outscraper.rb
CHANGED
@@ -10,7 +10,7 @@ module Outscraper
|
|
10
10
|
base_uri 'https://api.app.outscraper.com'
|
11
11
|
|
12
12
|
def initialize(api_key)
|
13
|
-
self.class.headers 'X-API-KEY' => api_key
|
13
|
+
self.class.headers 'X-API-KEY' => api_key, 'Accept-Encoding' => 'utf-8'
|
14
14
|
end
|
15
15
|
|
16
16
|
def google_search(query, pages_per_query: 1, uule: '', language: 'en', region: nil)
|
@@ -24,6 +24,18 @@ module Outscraper
|
|
24
24
|
}).parsed_response['data']
|
25
25
|
end
|
26
26
|
|
27
|
+
def google_search_news(query, pages_per_query: 1, uule: '', tbs: '', language: 'en', region: nil, async_request: false)
|
28
|
+
response = self.class.get('/google-search-news', query: {
|
29
|
+
query: query,
|
30
|
+
pagesPerQuery: pages_per_query,
|
31
|
+
uule: uule,
|
32
|
+
tbs: tbs,
|
33
|
+
language: language,
|
34
|
+
region: region,
|
35
|
+
async: async_request
|
36
|
+
}).parsed_response['data']
|
37
|
+
end
|
38
|
+
|
27
39
|
def google_maps_search(query, limit: 20, drop_duplicates: false, language: 'en', region: nil, skip: 0)
|
28
40
|
response = self.class.get("/maps/search-v2", 'query': {
|
29
41
|
query: query,
|
@@ -36,6 +48,34 @@ module Outscraper
|
|
36
48
|
}).parsed_response['data']
|
37
49
|
end
|
38
50
|
|
51
|
+
def google_maps_search_v3(query, limit: 20, language: 'en', region: nil, skip: 0, drop_duplicates: false, enrichment: nil, async_request: true)
|
52
|
+
response = self.class.get('/maps/search-v3', query: {
|
53
|
+
query: query,
|
54
|
+
language: language,
|
55
|
+
region: region,
|
56
|
+
organizationsPerQueryLimit: limit,
|
57
|
+
skipPlaces: skip,
|
58
|
+
dropDuplicates: drop_duplicates,
|
59
|
+
enrichment: enrichment ? Array(enrichment) : nil,
|
60
|
+
async: async_request
|
61
|
+
}).parsed_response['data']
|
62
|
+
end
|
63
|
+
|
64
|
+
def google_maps_directions(origin: '', destination: '', departure_time: nil, finish_time: nil, interval: nil, travel_mode: 'best', language: 'en', region: nil, fields: nil, async_request: true)
|
65
|
+
response = self.class.get('/maps/directions', query: {
|
66
|
+
origin: Array(origin),
|
67
|
+
destination: Array(destination),
|
68
|
+
departure_time: departure_time,
|
69
|
+
finish_time: finish_time,
|
70
|
+
interval: interval,
|
71
|
+
travel_mode: travel_mode,
|
72
|
+
language: language,
|
73
|
+
region: region,
|
74
|
+
async: async_request,
|
75
|
+
fields: fields ? Array(fields) : nil
|
76
|
+
}).parsed_response['data']
|
77
|
+
end
|
78
|
+
|
39
79
|
def google_maps_reviews(query, reviews_limit: 10, limit: 1, sort: 'most_relevant', skip: 0, start: 0, cutoff: 0, cutoff_rating: 0, ignore_empty: false, language: 'en', region: nil, reviews_query: nil)
|
40
80
|
response = self.class.get("/maps/reviews-v3", 'query': {
|
41
81
|
query: query,
|
@@ -54,6 +94,34 @@ module Outscraper
|
|
54
94
|
}).parsed_response['data']
|
55
95
|
end
|
56
96
|
|
97
|
+
def get_google_maps_photos(query, options = {})
|
98
|
+
response = self.class.get('/maps/photos-v3', query: {
|
99
|
+
query: query,
|
100
|
+
photosLimit: options[:photosLimit] || 100,
|
101
|
+
limit: options[:limit] || 1,
|
102
|
+
tag: options[:tag] || 'all',
|
103
|
+
language: options[:language] || 'en',
|
104
|
+
region: options[:region],
|
105
|
+
fields: options[:fields],
|
106
|
+
async: options.key?(:async) ? options[:async] : true,
|
107
|
+
ui: options[:ui] || false,
|
108
|
+
webhook: options[:webhook]
|
109
|
+
}).parsed_response['data']
|
110
|
+
end
|
111
|
+
|
112
|
+
def google_play_reviews(query, reviews_limit: 100, sort: 'most_relevant', cutoff: nil, rating: nil, language: 'en', fields: nil, async_request: false)
|
113
|
+
response = self.class.get('/google-play/reviews', query: {
|
114
|
+
query: query,
|
115
|
+
limit: reviews_limit,
|
116
|
+
sort: sort,
|
117
|
+
cutoff: cutoff,
|
118
|
+
rating: rating,
|
119
|
+
language: language,
|
120
|
+
async: async_request,
|
121
|
+
fields: fields ? Array(fields) : nil
|
122
|
+
}).parsed_response['data']
|
123
|
+
end
|
124
|
+
|
57
125
|
def emails_and_contacts(query)
|
58
126
|
response = self.class.get("/emails-and-contacts", 'query': {
|
59
127
|
query: query,
|
@@ -67,5 +135,191 @@ module Outscraper
|
|
67
135
|
async: false,
|
68
136
|
}).parsed_response['data']
|
69
137
|
end
|
138
|
+
|
139
|
+
def amazon_products(query, limit: 24, domain: 'amazon.com', postal_code: '11201', fields: nil, async_request: false)
|
140
|
+
response = self.class.get('/amazon/products-v2', query: {
|
141
|
+
query: query,
|
142
|
+
limit: limit,
|
143
|
+
domain: domain,
|
144
|
+
postal_code: postal_code,
|
145
|
+
async: async_request,
|
146
|
+
fields: fields ? Array(fields) : nil
|
147
|
+
}).parsed_response['data']
|
148
|
+
end
|
149
|
+
|
150
|
+
def amazon_reviews(query, limit: 10, sort: 'helpful', filter_by_reviewer: 'all_reviews', filter_by_star: 'all_stars', domain: nil, fields: nil, async_request: false)
|
151
|
+
response = self.class.get('/amazon/reviews', query: {
|
152
|
+
query: query,
|
153
|
+
limit: limit,
|
154
|
+
sort: sort,
|
155
|
+
filterByReviewer: filter_by_reviewer,
|
156
|
+
filterByStar: filter_by_star,
|
157
|
+
domain: domain,
|
158
|
+
async: async_request,
|
159
|
+
fields: fields ? Array(fields) : nil
|
160
|
+
}).parsed_response['data']
|
161
|
+
end
|
162
|
+
|
163
|
+
def yelp_search(query, limit: 100, async_request: false)
|
164
|
+
response = self.class.get('/yelp-search', query: {
|
165
|
+
query: query,
|
166
|
+
limit: limit,
|
167
|
+
async: async_request
|
168
|
+
}).parsed_response['data']
|
169
|
+
end
|
170
|
+
|
171
|
+
def yelp_reviews(query, limit: 100, cursor: '', sort: 'relevance_desc', cutoff: '', fields: '', async_request: false)
|
172
|
+
response = self.class.get('/yelp/reviews', query: {
|
173
|
+
query: query,
|
174
|
+
limit: limit,
|
175
|
+
cursor: cursor,
|
176
|
+
sort: sort,
|
177
|
+
cutoff: cutoff,
|
178
|
+
fields: fields,
|
179
|
+
async: async_request
|
180
|
+
}).parsed_response['data']
|
181
|
+
end
|
182
|
+
|
183
|
+
def tripadvisor_reviews(query, limit: 100, async_request: false)
|
184
|
+
response = self.class.get('/tripadvisor-reviews', query: {
|
185
|
+
query: query,
|
186
|
+
limit: limit,
|
187
|
+
async: async_request
|
188
|
+
}).parsed_response['data']
|
189
|
+
end
|
190
|
+
|
191
|
+
def app_store_reviews(query, limit: 100, sort: 'mosthelpful', cutoff: nil, fields: '', async_request: false)
|
192
|
+
response = self.class.get('/appstore/reviews', query: {
|
193
|
+
query: query,
|
194
|
+
limit: limit,
|
195
|
+
sort: sort,
|
196
|
+
cutoff: cutoff,
|
197
|
+
fields: fields,
|
198
|
+
async: async_request
|
199
|
+
}).parsed_response['data']
|
200
|
+
end
|
201
|
+
|
202
|
+
def youtube_comments(query, per_query: 100, language: 'en', region: '', fields: '', async_request: false)
|
203
|
+
response = self.class.get('/youtube-comments', query: {
|
204
|
+
query: query,
|
205
|
+
perQuery: per_query,
|
206
|
+
language: language,
|
207
|
+
region: region,
|
208
|
+
fields: fields,
|
209
|
+
async: async_request
|
210
|
+
}).parsed_response['data']
|
211
|
+
end
|
212
|
+
|
213
|
+
def g2_reviews(query, limit: 100, sort: '', cutoff: nil, fields: nil, async_request: false)
|
214
|
+
response = self.class.get('/g2/reviews', query: {
|
215
|
+
query: query,
|
216
|
+
limit: limit,
|
217
|
+
sort: sort,
|
218
|
+
cutoff: cutoff,
|
219
|
+
async: async_request,
|
220
|
+
fields: fields ? Array(fields) : nil
|
221
|
+
}).parsed_response['data']
|
222
|
+
end
|
223
|
+
|
224
|
+
def trustpilot_reviews(query, limit: 100, languages: 'default', sort: '', cutoff: nil, fields: '', async_request: false)
|
225
|
+
response = self.class.get('/trustpilot/reviews', query: {
|
226
|
+
query: query,
|
227
|
+
limit: limit,
|
228
|
+
languages: languages,
|
229
|
+
sort: sort,
|
230
|
+
cutoff: cutoff,
|
231
|
+
fields: fields,
|
232
|
+
async: async_request
|
233
|
+
}).parsed_response['data']
|
234
|
+
end
|
235
|
+
|
236
|
+
def glassdoor_reviews(query, limit: 100, sort: 'DATE', cutoff: nil, async_request: false)
|
237
|
+
response = self.class.get('/glassdoor/reviews', query: {
|
238
|
+
query: query,
|
239
|
+
limit: limit,
|
240
|
+
sort: sort,
|
241
|
+
cutoff: cutoff,
|
242
|
+
async: async_request
|
243
|
+
}).parsed_response['data']
|
244
|
+
end
|
245
|
+
|
246
|
+
def capterra_reviews(query, limit: 100, sort: '', cutoff: nil, language: 'en', region: nil, fields: nil, async_request: false)
|
247
|
+
response = self.class.get('/capterra-reviews', query: {
|
248
|
+
query: query,
|
249
|
+
limit: limit,
|
250
|
+
sort: sort,
|
251
|
+
cutoff: cutoff,
|
252
|
+
language: language,
|
253
|
+
region: region,
|
254
|
+
async: async_request,
|
255
|
+
fields: fields ? Array(fields) : nil
|
256
|
+
}).parsed_response['data']
|
257
|
+
end
|
258
|
+
|
259
|
+
def geocoding(query, async_request: false)
|
260
|
+
response = self.class.get('/geocoding', query: {
|
261
|
+
query: query,
|
262
|
+
async: async_request
|
263
|
+
}).parsed_response['data']
|
264
|
+
end
|
265
|
+
|
266
|
+
def reverse_geocoding(query, async_request: false)
|
267
|
+
response = self.class.get('/reverse-geocoding', query: {
|
268
|
+
query: query,
|
269
|
+
async: async_request
|
270
|
+
}).parsed_response['data']
|
271
|
+
end
|
272
|
+
|
273
|
+
def phone_identity_finder(query, async_request: false)
|
274
|
+
response = self.class.get('/whitepages-phones', query: {
|
275
|
+
query: query.is_a?(Array) ? query : [query],
|
276
|
+
async: async_request
|
277
|
+
}).parsed_response['data']
|
278
|
+
end
|
279
|
+
|
280
|
+
def address_scraper(query, async_request: false)
|
281
|
+
response = self.class.get('/whitepages-addresses', query: {
|
282
|
+
query: query.is_a?(Array) ? query : [query],
|
283
|
+
async: async_request
|
284
|
+
}).parsed_response['data']
|
285
|
+
end
|
286
|
+
|
287
|
+
def company_insights(query, fields: '', async_request: false, enrichments: [])
|
288
|
+
response = self.class.get('/company-insights', query: {
|
289
|
+
query: query.is_a?(Array) ? query : [query],
|
290
|
+
fields: fields,
|
291
|
+
enrichments: enrichments.is_a?(Array) ? enrichments : [enrichments],
|
292
|
+
async: async_request
|
293
|
+
}).parsed_response['data']
|
294
|
+
end
|
295
|
+
|
296
|
+
def validate_emails(query, async_request: false)
|
297
|
+
response = self.class.get('/email-validator', query: {
|
298
|
+
query: query.is_a?(Array) ? query : [query],
|
299
|
+
async: async_request
|
300
|
+
}).parsed_response['data']
|
301
|
+
end
|
302
|
+
|
303
|
+
def trustpilot(query, enrichment: [], fields: '', async_request: false)
|
304
|
+
enrichment_array = enrichment ? (enrichment.is_a?(Array) ? enrichment : [enrichment]) : []
|
305
|
+
response = self.class.get('/trustpilot', query: {
|
306
|
+
query: query.is_a?(Array) ? query : [query],
|
307
|
+
enrichment: enrichment_array,
|
308
|
+
fields: fields,
|
309
|
+
async: async_request
|
310
|
+
}).parsed_response['data']
|
311
|
+
end
|
312
|
+
|
313
|
+
def trustpilot_search(query, limit: 100, skip: 0, enrichment: [], fields: '', async_request: false)
|
314
|
+
enrichment_array = enrichment.is_a?(Array) ? enrichment : [enrichment]
|
315
|
+
response = self.class.get('/trustpilot', query: {
|
316
|
+
query: query.is_a?(Array) ? query : [query],
|
317
|
+
limit: limit,
|
318
|
+
skip: skip,
|
319
|
+
enrichment: enrichment_array,
|
320
|
+
fields: fields,
|
321
|
+
async: async_request
|
322
|
+
}).parsed_response['data']
|
323
|
+
end
|
70
324
|
end
|
71
325
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: outscraper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Outscraper
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -58,7 +58,7 @@ metadata:
|
|
58
58
|
bug_tracker_uri: https://github.com/outscraper/outscraper-ruby/issues
|
59
59
|
documentation_uri: https://app.outscraper.com/api-docs
|
60
60
|
github_repo: ssh://github.com/outscraper/outscraper-ruby
|
61
|
-
post_install_message:
|
61
|
+
post_install_message:
|
62
62
|
rdoc_options: []
|
63
63
|
require_paths:
|
64
64
|
- lib
|
@@ -66,15 +66,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
66
|
requirements:
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 2.
|
69
|
+
version: 2.7.0
|
70
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '0'
|
75
75
|
requirements: []
|
76
|
-
rubygems_version: 3.
|
77
|
-
signing_key:
|
76
|
+
rubygems_version: 3.1.6
|
77
|
+
signing_key:
|
78
78
|
specification_version: 4
|
79
79
|
summary: Ruby bindings for the Outscraper API
|
80
80
|
test_files: []
|