newegg_scraper_chsbr 0.1.4 → 0.2.5

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: 11059b9bceeeef9708cfe6a2c5f3580382d6d3bc433912236ab994f9bb6f32d5
4
- data.tar.gz: b59fb69c6336168d4298e3c844ac53e3cc53dd8494a9e3d9a06f770e8ee61399
3
+ metadata.gz: 6a1b81329b2a7b6d81d367cb748a541aadf7ec20bc5e6de1cb4d3a213272d0f2
4
+ data.tar.gz: f0db86150303b05d41ba55e7e7e9da56a0c5b4517d7e18e2d8f7e297cf35171d
5
5
  SHA512:
6
- metadata.gz: 0c0c58f08256a1122cdcf3de9ad9db3ebb0df98a1dd046d5e18f9a7ba66b0516c2b64c7ac3f4a92fc4cdf4147ed326fd924c3f7d3327337679eb84b553561d40
7
- data.tar.gz: e7b300cbd9a4e0410e0d91888bb268ecaa4cb7d35b10b49caf19feec47e4c707ad3f10e7d8d26d036dfe0c342781617f477e7cbda486f22491dddf14e3647c07
6
+ metadata.gz: 3f181080b9900c467cbc954c7174aee44515cdab8f7261007a3cf5a1716334d8c7e6f9d6941d4b56a47e72d3e8a7c507ae10b93e060af63fb491e5e53da13a67
7
+ data.tar.gz: 0cfa7c6ef87a6af288baa2011fc8f0d9ed19669c06604cbc4dbdcd70febe493862c7f00501807e5dec9298a26411a9778be6beb14f2cd3afe9caf34504335e34
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
@@ -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
- @user.choose_cpu
23
- NeweggScraperChsbr::Cpu.display_cpu_with_extras(@user)
24
- puts "If you would like to continue please enter : #{@counter}.\nTo exit type n or exit."
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
- puts "Please enter the minimum you would spend on a CPU."
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)) ? 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")
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(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,15 +7,28 @@ 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
- chosen = gets.strip.to_i
13
- @chosen_cpu << chosen
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NeweggScraperChsbr
4
- VERSION = "0.1.4"
4
+ VERSION = "0.2.5"
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.1.4
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-17 00:00:00.000000000 Z
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: '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