ml_s4m 0.8 → 0.9.5
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/.ruby-version +1 -1
- data/README.md +13 -5
- data/lib/ml_s4m.rb +38 -36
- data/lib/ml_s4m/version.rb +1 -1
- data/ml_s4m.gemspec +5 -5
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b8413199a424e43bf602f76292cd9d879c124ff648967bd6cde63b30609bfbb8
|
4
|
+
data.tar.gz: 1c3b5a3fff1e4aa2605fb67383f36210ade550b280886dda5116e93d707dc4e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2031580a6633522537c69c85e400fcab4a2eb1ad936090917ed85002b0dc7fc962ebcb44830cdad90badaa207eccafb8ddd1c33b63215fbe8772cb332400dd1f
|
7
|
+
data.tar.gz: 639a811aab91d6e761b0c100ff8d3c0a4c94195b25d7712bdd3af781c558cfd7a35884f96905ad7d09a08fa8419b56465e0601ef2d2494be4d5774a93fba5736
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.4.1
|
data/README.md
CHANGED
@@ -1,15 +1,12 @@
|
|
1
1
|
# MlS4m
|
2
2
|
|
3
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ml_s4m`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
3
|
|
7
4
|
## Installation
|
8
5
|
|
9
6
|
Add this line to your application's Gemfile:
|
10
7
|
|
11
8
|
```ruby
|
12
|
-
gem 'ml_s4m'
|
9
|
+
gem 'ml_s4m', '0.9.5'
|
13
10
|
```
|
14
11
|
|
15
12
|
And then execute:
|
@@ -22,7 +19,18 @@ Or install it yourself as:
|
|
22
19
|
|
23
20
|
## Usage
|
24
21
|
|
25
|
-
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
ml = MlS4m::MercadoLivre.new
|
25
|
+
# list_search = ml.setPNSearch(PART_NUMBER, CATEGORY)
|
26
|
+
# CATEGIRY in ["ML_DRONE", "ML_INFO", "ML_CAMERA", "ML_PHONE")
|
27
|
+
|
28
|
+
# search in INFO
|
29
|
+
list_search = ml.setPNSearch("MPTU2", "ML_INFO")
|
30
|
+
# list = [1099.0, 1264.0, 1239.0, 744.0, 1110.0, 979.0, 935.0, 949.0, 1319.0, 930.0, 1460.0, 1171.0, 1109.0] prices in ML
|
31
|
+
top_50 = list_search.top5Offers() #top 50 first
|
32
|
+
```
|
33
|
+
|
26
34
|
|
27
35
|
## Development
|
28
36
|
|
data/lib/ml_s4m.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
require "ml_s4m/version"
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'open-uri'
|
4
|
-
require 'pry'
|
5
4
|
|
6
5
|
module MlS4m
|
7
6
|
class MercadoLivre
|
8
|
-
def initialize
|
9
|
-
@pn = nil
|
7
|
+
def initialize
|
10
8
|
@url = {
|
11
|
-
:ML_INFO => '
|
12
|
-
:ML_CAMERA => '
|
13
|
-
:ML_PHONE => '
|
9
|
+
:ML_INFO => 'https://informatica.mercadolivre.com.br/PARTNUMBER_DisplayType_LF_ItemTypeID_N',
|
10
|
+
:ML_CAMERA => 'https://cameras.mercadolivre.com.br/PARTNUMBER_DisplayType_LF_ItemTypeID_N',
|
11
|
+
:ML_PHONE => 'https://celulares.mercadolivre.com.br/PARTNUMBER_DisplayType_LF_ItemTypeID_N',
|
12
|
+
:ML_DRONE => 'https://eletronicos.mercadolivre.com.br/drones-e-acessorios-drone/PARTNUMBER_DisplayType_LF_ItemTypeID_N'
|
14
13
|
}
|
15
14
|
@url_default = nil
|
16
15
|
@offers = []
|
@@ -18,47 +17,50 @@ module MlS4m
|
|
18
17
|
|
19
18
|
def setPNSearch(partNumber = nil, category = nil)
|
20
19
|
unless partNumber.nil?
|
21
|
-
@
|
20
|
+
@offers = []
|
21
|
+
ppn = partNumber.downcase
|
22
22
|
@url_default = @url[category.to_sym] unless category.nil?
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
if !item.children[6].children[1].nil? && item.children[6].children[1].children[1].nil?
|
32
|
-
price = item.children[6].children[1].children[1].text
|
33
|
-
price.gsub('R$ ','').gsub('.','') unless price.nil?
|
34
|
-
list_price << price unless price.nil?
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
if list_price.empty?
|
39
|
-
list = page.css('div').css('section').css('ol#searchResults').css('li')
|
40
|
-
list_price = []
|
41
|
-
list.each do |item|
|
42
|
-
if item.children[6].nil?
|
43
|
-
item.children[1].children[1].children[1].children[2].children[1].nil? || item.children[1].children[1].children[1].children[2].children[1].children[3].nil?
|
44
|
-
price = item.children[1].children[1].children[1].children[2].children[1].children[3].text
|
45
|
-
list_price << price unless price.nil?
|
46
|
-
end
|
47
|
-
end
|
48
|
-
@offers = list_price.map{ |x| current2int(x) }
|
23
|
+
pn = ["#{ppn.gsub(' ','%20')}", "#{ppn.gsub(' ','%20')}ll", "#{ppn.gsub(' ','%20')}bz"]
|
24
|
+
pn.each do |pnumber|
|
25
|
+
url_page = @url_default.gsub('PARTNUMBER', pnumber.gsub(' ','%20'))
|
26
|
+
begin
|
27
|
+
page = Nokogiri::HTML(open(url_page))
|
28
|
+
@offers += crawler_list(page) unless page.nil?
|
29
|
+
rescue OpenURI::HTTPError
|
30
|
+
puts "[ERROR] - Nesta categoria não há anúncios que coincidam com a sua busca - #{pnumber}"
|
49
31
|
end
|
50
|
-
rescue OpenURI::HTTPError
|
51
32
|
end
|
52
|
-
|
33
|
+
return @offers
|
34
|
+
end
|
53
35
|
end
|
54
36
|
|
55
37
|
def top5Offers
|
56
|
-
@offers[1..5] if @offers.count > 4
|
38
|
+
@offers[1..5] if @offers.count > 4
|
57
39
|
end
|
58
40
|
|
59
41
|
private
|
60
42
|
def current2int(money = nil)
|
61
43
|
money.delete(" R$ ").gsub('.','').gsub(',','.').to_f if !money.nil? && money.class == String
|
62
44
|
end
|
45
|
+
|
46
|
+
def crawler_list(page = nil)
|
47
|
+
unless page.nil?
|
48
|
+
begin
|
49
|
+
list = page.css('div').css('section').css('ol#searchResults').css('li')
|
50
|
+
list_price = []
|
51
|
+
list.each do |item|
|
52
|
+
unless item.children[1].nil?
|
53
|
+
unless item.css('.price-fraction').nil?
|
54
|
+
price = item.css('.price__fraction').text
|
55
|
+
list_price << price unless price.nil?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
return list_price.map{ |x| current2int(x) }
|
60
|
+
rescue StandardError => e
|
61
|
+
puts "[ML] error 1 - crawler_list #{e}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
63
65
|
end
|
64
66
|
end
|
data/lib/ml_s4m/version.rb
CHANGED
data/ml_s4m.gemspec
CHANGED
@@ -29,10 +29,10 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
30
|
spec.require_paths = ["lib"]
|
31
31
|
|
32
|
-
spec.add_development_dependency "bundler", "
|
33
|
-
spec.add_development_dependency "rake", "~>
|
34
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
32
|
+
spec.add_development_dependency "bundler", "1.16.6"
|
33
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
34
|
+
spec.add_development_dependency "rspec", "~> 3.8.0"
|
35
35
|
spec.add_development_dependency "pry", "~> 0.10.1"
|
36
|
-
|
37
|
-
spec.add_dependency "nokogiri", "1.
|
36
|
+
|
37
|
+
spec.add_dependency "nokogiri", "1.10.1"
|
38
38
|
end
|
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ml_s4m
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo Alencar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.16.6
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.16.6
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 3.8.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 3.8.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
75
|
+
version: 1.10.1
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
82
|
+
version: 1.10.1
|
83
83
|
description: Search in Mercado Livre
|
84
84
|
email:
|
85
85
|
- lebas66@gmail.com
|
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
119
|
version: '0'
|
120
120
|
requirements: []
|
121
121
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
122
|
+
rubygems_version: 2.7.9
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
125
|
summary: Search in Mercado Livre
|