newegg_scraper_chsbr 0.1.4 → 0.2.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 +4 -4
- data/bin/newegg_scraper +1 -1
- data/lib/newegg_scraper_chsbr/cli.rb +52 -12
- data/lib/newegg_scraper_chsbr/cpu.rb +24 -5
- data/lib/newegg_scraper_chsbr/data_grabber.rb +33 -65
- data/lib/newegg_scraper_chsbr/name.rb +1 -1
- data/lib/newegg_scraper_chsbr/scraper.rb +1 -1
- data/lib/newegg_scraper_chsbr/user.rb +17 -4
- data/lib/newegg_scraper_chsbr/version.rb +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a1b81329b2a7b6d81d367cb748a541aadf7ec20bc5e6de1cb4d3a213272d0f2
|
4
|
+
data.tar.gz: f0db86150303b05d41ba55e7e7e9da56a0c5b4517d7e18e2d8f7e297cf35171d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f181080b9900c467cbc954c7174aee44515cdab8f7261007a3cf5a1716334d8c7e6f9d6941d4b56a47e72d3e8a7c507ae10b93e060af63fb491e5e53da13a67
|
7
|
+
data.tar.gz: 0cfa7c6ef87a6af288baa2011fc8f0d9ed19669c06604cbc4dbdcd70febe493862c7f00501807e5dec9298a26411a9778be6beb14f2cd3afe9caf34504335e34
|
data/bin/newegg_scraper
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
class NeweggScraperChsbr::CLI
|
1
|
+
class NeweggScraperChsbr::Cli
|
3
2
|
attr_reader :user
|
4
3
|
def initialize
|
5
4
|
NeweggScraperChsbr::DataGrabber.new
|
@@ -18,10 +17,16 @@ class NeweggScraperChsbr::CLI
|
|
18
17
|
while @counter == 'y'
|
19
18
|
get_price_range
|
20
19
|
get_init_data_for_user
|
21
|
-
NeweggScraperChsbr::Cpu.display_cpu(@user)
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
printed_cpus = NeweggScraperChsbr::Cpu.display_cpu(@user)
|
21
|
+
|
22
|
+
if printed_cpus.size != 0
|
23
|
+
@user.choose_cpu(printed_cpus)
|
24
|
+
NeweggScraperChsbr::Cpu.display_cpu_with_extras(@user)
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
puts "If you would like to restart the program please enter : #{@counter}.\nTo exit type n or exit."
|
25
30
|
@counter = gets.strip
|
26
31
|
corr_input = control_bool
|
27
32
|
while corr_input
|
@@ -44,7 +49,6 @@ class NeweggScraperChsbr::CLI
|
|
44
49
|
@cpu_make = gets.strip
|
45
50
|
not_found = cpu_make_bool
|
46
51
|
while not_found
|
47
|
-
puts "\n\n\n\n THIS IS CPU_MAKE: #{@cpu_make}\n\n\n IS THIS TRUE?: #{!@cpu_make.include?("x") || !@cpu_make.include?("a") || !@cpu_make.include?("i") || @cpu_make == nil }\n"
|
48
52
|
puts "Are you searching for Intel or AMD?"
|
49
53
|
puts "Please put i for Intel, or a for AMD."
|
50
54
|
puts "Please put x for either."
|
@@ -85,15 +89,17 @@ class NeweggScraperChsbr::CLI
|
|
85
89
|
puts "$500.50, please enter as 501, or 500 to stay below budget."
|
86
90
|
@max_price = gets.strip
|
87
91
|
end
|
88
|
-
|
89
|
-
puts "Please use the same format as above."
|
90
|
-
@min_price = gets.strip
|
91
|
-
while @min_price.to_i <= 0 || @min_price.to_i >= @max_price.to_i || @min_price.include?("$") || @min_price.include?(".") || @min_price == nil
|
92
|
+
if @max_price.to_i != 0
|
92
93
|
puts "Please enter the minimum you would spend on a CPU."
|
93
94
|
puts "Please use the same format as above."
|
94
95
|
@min_price = gets.strip
|
96
|
+
|
97
|
+
while @min_price.to_i <= 0 || @min_price.to_i >= @max_price.to_i || @min_price.include?("$") || @min_price.include?(".") || @min_price == nil
|
98
|
+
puts "Please enter the minimum you would spend on a CPU."
|
99
|
+
puts "Please use the same format as above."
|
100
|
+
@min_price = gets.strip
|
101
|
+
end
|
95
102
|
end
|
96
|
-
|
97
103
|
end
|
98
104
|
def control_bool
|
99
105
|
if @counter.include?("y")
|
@@ -108,14 +114,48 @@ class NeweggScraperChsbr::CLI
|
|
108
114
|
end
|
109
115
|
def cpu_make_bool
|
110
116
|
if @cpu_make.include?("x")
|
117
|
+
@cpu_make = "x"
|
111
118
|
false
|
112
119
|
elsif @cpu_make.include?("a")
|
120
|
+
@cpu_make = "a"
|
113
121
|
false
|
114
122
|
elsif @cpu_make.include?("i")
|
123
|
+
@cpu_make = "i"
|
115
124
|
false
|
116
125
|
else
|
117
126
|
true
|
118
127
|
end
|
119
128
|
|
120
129
|
end
|
130
|
+
# def choose_cpu(printed_cpus)
|
131
|
+
# puts "Please enter the number of the CPU you'd like to see more about."
|
132
|
+
# chosen = gets.strip
|
133
|
+
# while !is_numeric?(chosen)
|
134
|
+
# puts "Please enter the number of the CPU you'd like to see more about."
|
135
|
+
# chosen = gets.strip
|
136
|
+
# end
|
137
|
+
# if !printed_cpus.include?(chosen.to_i)
|
138
|
+
# puts "You chose a CPU outside of your budget please choose another."
|
139
|
+
# choose_cpu(printed_cpus)
|
140
|
+
# end
|
141
|
+
# @user.chosen_cpu << chosen.to_i
|
142
|
+
# puts "Would you like to see more about another CPU?\nEnter y to do so.\nEnter n to see details about the chosen CPU(s)"
|
143
|
+
# input = gets.strip
|
144
|
+
|
145
|
+
# if input == 'y'
|
146
|
+
# choose_cpu(printed_cpus)
|
147
|
+
# end
|
148
|
+
|
149
|
+
# end
|
150
|
+
# def is_numeric?(obj)
|
151
|
+
# obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
|
152
|
+
# end
|
153
|
+
# def self.display_cpu_with_extras(user)
|
154
|
+
|
155
|
+
# user.chosen_cpu.each do | chosen_cpu |
|
156
|
+
|
157
|
+
# puts "\n\n\n#{NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].name.name}\nHas a price of: #{NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].price.price}\nShipping: #{NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].shipping.price}\n\n Descriptive Points:\n"
|
158
|
+
# NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].printDesc
|
159
|
+
# end
|
160
|
+
# end
|
121
161
|
end
|
@@ -23,6 +23,7 @@ class NeweggScraperChsbr::Cpu
|
|
23
23
|
end
|
24
24
|
def self.display_cpu(user)
|
25
25
|
counter = 1
|
26
|
+
printed_cpus = []
|
26
27
|
@@all.each do | computer |
|
27
28
|
if user.max_price.to_i != 0 && user.min_price.to_i == 0
|
28
29
|
|
@@ -32,23 +33,41 @@ class NeweggScraperChsbr::Cpu
|
|
32
33
|
if user.max_price.to_i == 0 &&
|
33
34
|
user.min_price.to_i == 0 &&
|
34
35
|
(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "Intel" || NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "AMD")
|
35
|
-
computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make))
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
if computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make))
|
37
|
+
puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
|
38
|
+
printed_cpus << counter
|
39
|
+
else
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
elsif user.max_price.to_i == 0 && user.min_price.to_i == 0 && user.cpu_make == 'x'
|
43
|
+
|
39
44
|
puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
|
45
|
+
printed_cpus << counter
|
40
46
|
elsif user.max_price.to_i >= computer.price.convert_price &&
|
41
47
|
user.min_price.to_i <= computer.price.convert_price &&
|
42
48
|
(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "Intel" || NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make) == "AMD")
|
43
|
-
computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make))
|
49
|
+
if computer.name.name.include?(NeweggScraperChsbr::Cpu.cpu_maker(user.cpu_make))
|
50
|
+
puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
|
51
|
+
printed_cpus << counter
|
52
|
+
else
|
53
|
+
nil
|
54
|
+
end
|
44
55
|
|
45
56
|
elsif user.max_price.to_i >= computer.price.convert_price &&
|
46
57
|
user.min_price.to_i <= computer.price.convert_price &&
|
47
58
|
user.cpu_make == 'x'
|
48
59
|
puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}")
|
60
|
+
printed_cpus << counter
|
61
|
+
|
49
62
|
end
|
63
|
+
|
50
64
|
counter += 1
|
65
|
+
|
66
|
+
end
|
67
|
+
if printed_cpus.size == 0
|
68
|
+
puts "You did not match any CPU criteria."
|
51
69
|
end
|
70
|
+
printed_cpus
|
52
71
|
|
53
72
|
end
|
54
73
|
def self.display_cpu_with_extras(user)
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
class NeweggScraperChsbr::DataGrabber
|
3
2
|
attr_reader :cpus
|
4
3
|
|
@@ -9,7 +8,7 @@ class NeweggScraperChsbr::DataGrabber
|
|
9
8
|
names = getNames
|
10
9
|
descHash = getCpuDesc
|
11
10
|
@cpus = makeCpus(prices, names, shipping_price, descHash)
|
12
|
-
end
|
11
|
+
end
|
13
12
|
|
14
13
|
def getCpuDesc
|
15
14
|
scraped = NeweggScraperChsbr::Scraper.new
|
@@ -18,7 +17,10 @@ class NeweggScraperChsbr::DataGrabber
|
|
18
17
|
css_next_link = scraped.xml_obj.css ".item-title"
|
19
18
|
css_next_link.each_with_index do | element, index |
|
20
19
|
if index != 0
|
21
|
-
|
20
|
+
|
21
|
+
if element.attributes["href"] != nil
|
22
|
+
pages << element.attributes["href"].text
|
23
|
+
end
|
22
24
|
end
|
23
25
|
end
|
24
26
|
description = {}
|
@@ -44,19 +46,19 @@ class NeweggScraperChsbr::DataGrabber
|
|
44
46
|
|
45
47
|
|
46
48
|
end
|
47
|
-
def split_price(html_element)
|
49
|
+
def split_price(html_element)
|
48
50
|
counter = 0
|
49
51
|
until counter == 100
|
50
|
-
if counter < 10
|
51
|
-
if html_element.text.include?(".0#{counter.to_s}")
|
52
|
-
|
53
|
-
price = html_element.text.split ".0#{counter.to_s}"
|
54
|
-
|
55
|
-
|
52
|
+
if counter < 10
|
53
|
+
if html_element.text.include?(".0#{counter.to_s}")
|
54
|
+
|
55
|
+
price = html_element.text.split ".0#{counter.to_s}"
|
56
|
+
|
57
|
+
|
56
58
|
price.delete_at 1
|
57
|
-
return price, ".0#{counter.to_s}"
|
59
|
+
return price, ".0#{counter.to_s}"
|
58
60
|
end
|
59
|
-
elsif counter >= 10
|
61
|
+
elsif counter >= 10
|
60
62
|
if html_element.text.include?(".#{counter.to_s}")
|
61
63
|
|
62
64
|
price = (html_element.text.split ".#{counter.to_s}")
|
@@ -67,59 +69,35 @@ class NeweggScraperChsbr::DataGrabber
|
|
67
69
|
counter += 1
|
68
70
|
end
|
69
71
|
end
|
70
|
-
def isCoolerOrMB?(name)
|
71
|
-
name.include?("Water") || name.include?("Air") || name.include?("Motherboard")
|
72
|
-
# any of the products include
|
73
|
-
# words that describe motherboards and/or
|
74
|
-
# cooling products.
|
72
|
+
def isCoolerOrMB?(name)
|
73
|
+
name.include?("Water") || name.include?("Air") || name.include?("Motherboard") || name.include?("AIO") || name.include?("FLY") || name.include?("Cooler")
|
75
74
|
end
|
76
75
|
def getPrice
|
77
76
|
scraped_info = NeweggScraperChsbr::Scraper.new
|
78
|
-
css_price = scraped_info.xml_obj.css ".price-current"
|
79
|
-
# html that contains what I need to find the price.
|
77
|
+
css_price = scraped_info.xml_obj.css ".price-current"
|
80
78
|
|
81
|
-
prices = []
|
82
|
-
|
83
|
-
css_price.each do | piece | # Going 1 level deep into the html obj that contains the price text element.
|
84
|
-
|
85
|
-
temp_price = split_price piece # split_price will split the price, and return
|
86
|
-
# two variables in an array. The first element of
|
87
|
-
# the array will be the dollar amount.
|
88
|
-
# The second element will be the cent ammount because
|
89
|
-
# I deemed it easier to remove anything after the
|
90
|
-
# floating point, it was the only pattern that was
|
91
|
-
# consistent.
|
79
|
+
prices = []
|
92
80
|
|
81
|
+
css_price.each do | piece |
|
82
|
+
temp_price = split_price piece
|
93
83
|
if temp_price != nil
|
94
|
-
temp_price.flatten!
|
95
|
-
|
96
|
-
# to return the flattened array to temp_price.
|
97
|
-
|
98
|
-
prices << "#{temp_price[0]}#{temp_price[1]}" # Here prices is being shoveled the
|
99
|
-
# two elements, concatenated to create
|
100
|
-
# a string similar to "$00.00"
|
84
|
+
temp_price.flatten!
|
85
|
+
prices << "#{temp_price[0]}#{temp_price[1]}"
|
101
86
|
end
|
102
87
|
|
103
|
-
end
|
88
|
+
end
|
104
89
|
prices
|
105
90
|
end
|
106
91
|
def getNames
|
107
92
|
scraped = NeweggScraperChsbr::Scraper.new
|
108
|
-
names = []
|
109
|
-
# objects found on the page.
|
93
|
+
names = []
|
110
94
|
|
111
|
-
css_name = scraped.xml_obj.css ".item-title"
|
112
|
-
# object to be enumerated upon.
|
95
|
+
css_name = scraped.xml_obj.css ".item-title"
|
113
96
|
|
114
|
-
css_name.each_with_index do | name, index |
|
115
|
-
# to retrieve the strings.
|
97
|
+
css_name.each_with_index do | name, index |
|
116
98
|
|
117
|
-
index != 0 ? names << name.text : nil
|
118
|
-
|
119
|
-
# After I skip the first name
|
120
|
-
# I will shovel the text from the
|
121
|
-
# html object into the names array.
|
122
|
-
end #end names.each_with_index
|
99
|
+
index != 0 ? names << name.text : nil
|
100
|
+
end
|
123
101
|
names
|
124
102
|
end
|
125
103
|
def getShipping
|
@@ -136,23 +114,13 @@ class NeweggScraperChsbr::DataGrabber
|
|
136
114
|
|
137
115
|
|
138
116
|
cpus = []
|
139
|
-
prices.each_with_index do | price, index |
|
140
|
-
# each of the prices with their
|
141
|
-
# index so that the enumation can
|
142
|
-
# access the names array at the
|
143
|
-
# same time.
|
117
|
+
prices.each_with_index do | price, index |
|
144
118
|
|
145
|
-
if !isCoolerOrMB?(names[index])
|
146
|
-
|
147
|
-
# or motherboard because
|
148
|
-
# there is a price associated
|
149
|
-
# with the coolers on the
|
150
|
-
# website.
|
151
|
-
|
152
|
-
cpus << NeweggScraperChsbr::Cpu.new(names[index], price, shipping[index], desc_hash[index])
|
119
|
+
if !isCoolerOrMB?(names[index])
|
120
|
+
cpus << NeweggScraperChsbr::Cpu.new(names[index], prices[index - 1], shipping[index], desc_hash[index])
|
153
121
|
|
154
|
-
end
|
155
|
-
end
|
122
|
+
end
|
123
|
+
end
|
156
124
|
cpus
|
157
125
|
end
|
158
126
|
end
|
@@ -4,7 +4,7 @@ class NeweggScraperChsbr::Scraper
|
|
4
4
|
|
5
5
|
URL = "https://www.newegg.com/p/pl?d=cpu"
|
6
6
|
def initialize(url = URL)
|
7
|
-
@xml_obj = Nokogiri::HTML(open(url))
|
7
|
+
@xml_obj = Nokogiri::HTML(URI.open(url))
|
8
8
|
end
|
9
9
|
|
10
10
|
|
@@ -7,15 +7,28 @@ class NeweggScraperChsbr::User
|
|
7
7
|
@max_price = max_price
|
8
8
|
@chosen_cpu = []
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
|
+
def choose_cpu(printed_cpus)
|
11
12
|
puts "Please enter the number of the CPU you'd like to see more about."
|
12
|
-
chosen = gets.strip
|
13
|
-
|
13
|
+
chosen = gets.strip
|
14
|
+
while !is_numeric?(chosen)
|
15
|
+
puts "Please enter the number of the CPU you'd like to see more about."
|
16
|
+
chosen = gets.strip
|
17
|
+
end
|
18
|
+
if !printed_cpus.include?(chosen.to_i)
|
19
|
+
puts "You chose a CPU outside of your budget please choose another."
|
20
|
+
choose_cpu(printed_cpus)
|
21
|
+
end
|
22
|
+
@chosen_cpu << chosen.to_i
|
14
23
|
puts "Would you like to see more about another CPU?\nEnter y to do so.\nEnter n to see details about the chosen CPU(s)"
|
15
24
|
input = gets.strip
|
25
|
+
|
16
26
|
if input == 'y'
|
17
|
-
choose_cpu
|
27
|
+
choose_cpu(printed_cpus)
|
18
28
|
end
|
19
29
|
|
20
30
|
end
|
31
|
+
def is_numeric?(obj)
|
32
|
+
obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
|
33
|
+
end
|
21
34
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: newegg_scraper_chsbr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lrd134
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.11.3
|
20
20
|
type: :runtime
|
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.11.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: open-uri
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '0.1'
|
34
34
|
type: :runtime
|
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: '0'
|
40
|
+
version: '0.1'
|
41
41
|
description: To scrape CPU's off of Newegg and display them nicely.
|
42
42
|
email:
|
43
43
|
- larryc3200@gmail.com
|