newegg_scraper_chsbr 0.2.0 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dbfd1d76149f6e24674933978bc42dfed9c4793b07ede185dd890a9624ac8259
4
- data.tar.gz: dcf10106484e843c95d888d267725e8d3cee154a78ae8014c141baf9a160495b
3
+ metadata.gz: 3fbd42d7c10c468dc7425a30d88e29f8e6f268daa251709476c87e4ad071dc23
4
+ data.tar.gz: 02bd7b5230d23751a3904e2650ff50c7b0e6d761bd6f66c0d8179657963ee647
5
5
  SHA512:
6
- metadata.gz: 6eedd9aae8b3c008bb8485e882e24322d7b76ac61245f4690dd43772816f72e5a1b5be2ab7538be22c6fc643ab096a4f6530db673c0a04c2611e74fd5eaaec5b
7
- data.tar.gz: d4d473f51c977978959b4dd7e32a91938cb626bd90b2cb8cd4d83e9e6ea08136747b658ce45f9beefab02aa73445683ef177274f1ab30c659136f42637791388
6
+ metadata.gz: 05cfd1984328242a0da29c958d612473aba871b97bb2d2b03c705a85d148c5b0d58a3b26856b7a60a12699b46d5148a4870f7d89162604ca4da205101ab699c8
7
+ data.tar.gz: 16cfc1c007ce8c374d7bf0dc8b9cd9147cb37b23c303c64a856cf17faeeb6e7f4f4495a1103ca582cbce571ceefaef6bb35b792e9ccd25afb9cc939abdefcbe0
data/bin/newegg_scraper CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require_relative "../lib/environment.rb"
4
- NeweggScraperChsbr::CLI.new.call
4
+ NeweggScraperChsbr::Cli.new.call
@@ -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
@@ -8,29 +7,37 @@ class NeweggScraperChsbr::CLI
8
7
  puts "Were you interested in purchasing some CPU's?"
9
8
  puts "Please enter y to do so."
10
9
  @counter = gets.strip
11
- corr_input = control_bool
12
- while corr_input
10
+ incorrect_input = control_bool
11
+ while incorrect_input
13
12
  puts "Were you interested in purchasing some CPU's?"
14
13
  puts "Please enter y to do so.\nPlease enter n or exit to quit."
15
14
  @counter = gets.strip
16
- corr_input = control_bool
15
+ incorrect_input = control_bool
17
16
  end
18
17
  while @counter == 'y'
19
18
  get_price_range
20
19
  get_init_data_for_user
21
- NeweggScraperChsbr::Cpu.display_cpu(@user)
22
- @user.choose_cpu
23
- NeweggScraperChsbr::Cpu.display_cpu_with_extras(@user)
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
+
24
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
- corr_input = control_bool
27
- while corr_input
31
+ incorrect = control_bool
32
+ while incorrect
28
33
  puts "Were you interested in purchasing some CPU's?"
29
34
  puts "Please enter y to do so.\nPlease enter n or exit to quit."
30
35
  @counter = gets.strip
31
- corr_input = control_bool
36
+ incorrect = control_bool
32
37
  end
33
-
38
+ clear_vars
39
+ @user.clear_chosen
40
+ self.call
34
41
  end
35
42
  puts "Thanks for using Chesbro's Scraper!"
36
43
  end
@@ -97,26 +104,56 @@ class NeweggScraperChsbr::CLI
97
104
  end
98
105
  end
99
106
  def control_bool
100
- if @counter.include?("y")
101
- false
102
- elsif @counter.include?("exit")
107
+ if @counter == "y"
103
108
  false
104
- elsif @counter.include?("n")
109
+ elsif @counter == "exit" || @counter == "n"
105
110
  false
106
111
  else
107
112
  true
108
113
  end
109
114
  end
110
115
  def cpu_make_bool
111
- if @cpu_make.include?("x")
112
- false
113
- elsif @cpu_make.include?("a")
114
- false
115
- elsif @cpu_make.include?("i")
116
+ if @cpu_make == "x" || @cpu_make == "a" || @cpu_make == "i"
116
117
  false
117
118
  else
118
119
  true
119
120
  end
120
121
 
121
122
  end
123
+ def clear_vars
124
+ @cpu_make = nil
125
+ @min_price = nil
126
+ @max_price = nil
127
+ end
128
+ # def choose_cpu(printed_cpus)
129
+ # puts "Please enter the number of the CPU you'd like to see more about."
130
+ # chosen = gets.strip
131
+ # while !is_numeric?(chosen)
132
+ # puts "Please enter the number of the CPU you'd like to see more about."
133
+ # chosen = gets.strip
134
+ # end
135
+ # if !printed_cpus.include?(chosen.to_i)
136
+ # puts "You chose a CPU outside of your budget please choose another."
137
+ # choose_cpu(printed_cpus)
138
+ # end
139
+ # @user.chosen_cpu << chosen.to_i
140
+ # 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)"
141
+ # input = gets.strip
142
+
143
+ # if input == 'y'
144
+ # choose_cpu(printed_cpus)
145
+ # end
146
+
147
+ # end
148
+ # def is_numeric?(obj)
149
+ # obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
150
+ # end
151
+ # def self.display_cpu_with_extras(user)
152
+
153
+ # user.chosen_cpu.each do | chosen_cpu |
154
+
155
+ # 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"
156
+ # NeweggScraperChsbr::Cpu.all[chosen_cpu - 1].printDesc
157
+ # end
158
+ # end
122
159
  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)) ? puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}") : nil
36
- elsif user.max_price.to_i == 0 &&
37
- user.min_price.to_i == 0 &&
38
- user.cpu_make == 'x'
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)) ? puts("\n #{counter}:\n Name: #{computer.name.name}\n Price: #{computer.price.price}") : nil
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 #end initialize
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
- pages << element.attributes["href"].value
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) # This method checks each individual text element, this is to make sure the prices are accurate.
49
+ def split_price(html_element)
48
50
  counter = 0
49
51
  until counter == 100
50
- if counter < 10 # If the counter is less than 10, is necessary because the computer doesn't know we are working with money.
51
- if html_element.text.include?(".0#{counter.to_s}") #If the text element includes any dollar ammount below .10 is a neccessary check.
52
- #Otherwise the computer would only check [.0.. .9], and we need it to check [.00.. .09]
53
- price = html_element.text.split ".0#{counter.to_s}" #Once we know it's the correct element we can assign it to the price variable.
54
- #This is only necessary to be able to delete the data we are splitting off.
55
- # (We are splitting anything after the cents amount because it was uneccessary.)
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}" # Return the dollar amount, and the cents amount in an array.
59
+ return price, ".0#{counter.to_s}"
58
60
  end
59
- elsif counter >= 10 # This does the same as above, but for any number over 9.
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) # This methods name means is it a cooler or a motherboard?
71
- name.include?("Water") || name.include?("Air") || name.include?("Motherboard") # this will return true if
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") || name.include?("Block")
75
74
  end
76
75
  def getPrice
77
76
  scraped_info = NeweggScraperChsbr::Scraper.new
78
- css_price = scraped_info.xml_obj.css ".price-current" # This will set the variable equal to the
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 = [] # This will hold all of the prices in an array.
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! # When returned by #split_price the dollar amount is
95
- # nested inside of another array. I use flatten!
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 #end prices.each
88
+ end
104
89
  prices
105
90
  end
106
91
  def getNames
107
92
  scraped = NeweggScraperChsbr::Scraper.new
108
- names = [] # Names will hold the names of
109
- # objects found on the page.
93
+ names = []
110
94
 
111
- css_name = scraped.xml_obj.css ".item-title" # css_name will hold the html
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 | # css_name will be enumerated upon
115
- # to retrieve the strings.
97
+ css_name.each_with_index do | name, index |
116
98
 
117
- index != 0 ? names << name.text : nil # I have to skip the first name
118
- # because it does not have a price.
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 | # I will then enumerate on
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]) # Here the program check if
146
- # the name is a cooler
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 #end if
155
- end #end prices.each_with_index
122
+ end
123
+ end
156
124
  cpus
157
125
  end
158
126
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  class NeweggScraperChsbr::Name
4
4
  attr_accessor :name
5
- # @@all = []
5
+
6
6
  def initialize(name)
7
7
  @name = name
8
8
  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(URI.open(url)) # This opens the URL with open-uri, then parses it as an XML Object
7
+ @xml_obj = Nokogiri::HTML(URI.open(url))
8
8
  end
9
9
 
10
10
 
@@ -7,22 +7,30 @@ class NeweggScraperChsbr::User
7
7
  @max_price = max_price
8
8
  @chosen_cpu = []
9
9
  end
10
- def choose_cpu
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
13
  chosen = gets.strip
13
14
  while !is_numeric?(chosen)
14
15
  puts "Please enter the number of the CPU you'd like to see more about."
15
16
  chosen = gets.strip
16
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
17
22
  @chosen_cpu << chosen.to_i
18
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)"
19
24
  input = gets.strip
20
25
 
21
26
  if input == 'y'
22
- choose_cpu
27
+ choose_cpu(printed_cpus)
23
28
  end
24
29
 
25
30
  end
31
+ def clear_chosen
32
+ @chosen_cpu = []
33
+ end
26
34
  def is_numeric?(obj)
27
35
  obj.match(/\A[^+-]?\d+?(\^.\d+)?\Z/) == nil ? false : true
28
36
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NeweggScraperChsbr
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.6"
5
5
  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.2.0
4
+ version: 0.2.6
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-17 00:00:00.000000000 Z
11
+ date: 2021-04-28 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: '0'
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: '0'
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