ruby map创建
在我写的第一篇文章中,我决定撰写有关Web抓取以及如何使用Ruby和Nokogiri Gem构建“股市观察家”的文章。
首先要遵循本指南的一些要求:
- Ruby
- HTML / CSS基础
本指南的目的是展示您可以使用Ruby进行的操作,也许在那里,您将找到更好/专业的方法来执行此操作。
本文末尾将链接包含本指南中使用的完整代码的存储库。
让我们开始
首先,设置您的环境,创建一个包含我们的爬虫代码的ruby文件。
在这种情况下,我将创建一个名为stock_watcher.rb的文件,并将其添加以下代码。
#stock_watcher.rbrequire 'nokogiri'
require 'open-uri'
此代码需要一个名为Nokogiri的Ruby Gem(帮助我们处理从网站提取的数据)和open-uri模块以从Web提取数据。
此后,我们需要定义从何处获取刮板的数据,在这里您可以使用任何所需的网站,对于本指南,我将使用TradingView数据。
现在已经定义了源,我们需要从页面中获取数据,Nokogiri得到了一些有用的解析方法来帮助我们,由于要抓取HTML页面,因此我们将使用Nokogiri::HTML
解析器。
将以下代码添加到stock_watcher.rb
#stock_watcher.rb
page = Nokogiri::HTML(URI.open( 'https://www.tradingview.com/markets/stocks-usa/market-movers-large-cap' ))
这种简单的方法是使用URI模块从Web上获取数据并使用Nokogiri对其进行解析,然后返回Nokogiri::HTML::Document
。
通过页面对象,我们掌握了一堆有用的方法。
现在,我们必须使用HTML / CSS确认来定义要从页面上的何处获取数据。 Chrome开发人员工具是这里的好朋友。
有问题的页面是https://www.tradingview.com/markets/stocks-usa/market-movers-large-cap/ ,此页面向我们显示了以大写字母顺序排列的美国股票市场公司。 如您所见,此页面将数据存储在主表上,我们必须找到一种识别该表的方法。
Nokogiri为我们提供了一种称为“ css”的方法,该方法使我们可以在Nokogiri::HTML::Document
上搜索特定CSS规则,我们可以搜索特定CSS类,id等。
让我们尝试使用Chrome检查工具找出表的类或ID,只需右键单击任何表元素然后进行检查,您会发现一个类似于该窗口的窗口:
滚动一点,直到找到<table>标签,如下所示:
如您所见,我们的表使用“ tv-data-table”类,该类将成为我们的目标类。
现在我们有了表类,将以下代码添加到stock_watcher.rb :
#stock_watcher.rb
table = page&.css( '.tv-data-table' );
此代码获取我们的页面对象,并找到一个为其分配了“ tv-data-table”类HTML元素,并返回Nokogiri::XML::NodeSet
。
表中我们唯一需要的是表数据,表数据(td)存储在表行(tr)内。 Nokogiri::XML::NodeSet
提供了更有用的方法,使我们可以在其中搜索特定的键。
将以下代码添加到stock_watcher.rb :
#stock_watcher.rb
rows = table.search( 'tr' );
这将返回另一个Nokogiri::XML:NodeSet
,其中包含表中包含“ tr”的键和值的子集。
我们正在接近我们的目标。
现在将以下代码添加到stock_wacher.rb :
rows.eachdo |row|
stock_content = row.search( 'td' ).map { |td| td.text.strip }
stock_content[ 0 ]&.gsub!( "\n\t\t\t\t\t\t\t\t\t" , " " )
end
现在我们遍历XML子集,在这种情况下,它是包含股票数据的行。 然后,我们使用相同的方法搜索在每一行中搜索表数据(td),它返回一个包含迭代行的所有数据的数组。 我们需要剥离文本,因为Nokogiri在字符串中返回了很多无用的文本。
现在您可以使用该代码了,尝试在最后一个代码的end关键字之前打印使用“ puts stock_content”获得的库存内容,然后查看所得到的内容,它应该返回类似于以下内容的内容:
"[" MSFT Microsoft Corp. ", " 182.51 ", " -2.27 % ", " -4.23 ", " Buy ", " 31.952 M ", " 1384.054 B ", " 31.09 ", " 6.06 ", " 144000.00 ", " Technology Services "]"
掌握了可以确定下一步要做什么的数据之后,您将有成千上万种可以执行的操作的可能性,下面举几个例子:将数据存储在文件中以供以后检查,将数据存储在数据库中要在以后处理它甚至在另一个网站上显示数据(首先检查权限),请在股票价格达到所需价格时创建触发器。 正如我所说,有很多可能性。
现在,完成本指南,我已经创建了一个类来处理从最后一段代码中获得的数据。
首先,在同一文件夹中创建另一个文件,名为stock.rb并添加以下代码:
#stock.rb
class Stock
attr_reader :name , :last , :change_percentage , :change_value , :rating , :vol , :market_cap
def initialize (stock_data)
@name = stock_data[ 0 ]
@last = stock_data[ 1 ]
@change_percentage = stock_data[ 2 ]
@change_value = stock_data[ 3 ]
@rating = stock_data[ 4 ]
@vol = stock_data[ 5 ]
@market_cap = stock_data[ 6 ]
end
end
我不会解释类如何在Ruby上工作,因为这不是本指南的目的。 但基本上,该类接收我们从“ stack_content”变量中获得的数据并将其优雅地存储。
现在,将整个代码替换为stock_watcher.rb文件,如下所示:
#stock_watcher.rb
require 'nokogiri'
require 'open-uri'
require_relative 'stock'
page = Nokogiri::HTML(URI.open( 'https://www.tradingview.com/markets/stocks-usa/market-movers-large-cap' ))
table = page&.css( '.tv-data-table' );
rows = table.search( 'tr' );
stock_arr = []
rows.each do |row|
stock_content = row.search( 'td' ).map { |td| td.text.strip }
stock_content[ 0 ]&.gsub!( "\n\t\t\t\t\t\t\t\t\t" , " " )
stock_arr << Stock.new(stock_content) if stock_content.length.positive?
end
它需要我们的新类文件,创建一个名为stock_arr的新数组,并在其上存储每个新的stock对象。
如果您在stock_arr上打印第一个对象,则会得到以下内容:
"#<Stock:0x00007fffd443e2f8 @name=" MSFT Microsoft Corp. ", @last=" 182.51 ", @change_percentage=" - 2.27 % ", @change_value=" - 4.23 ", @rating=" Buy ", @vol=" 31.977 M ", @market_cap=" 1384.054 B ">"
如您所见,这是存储我们股票的一种更好的方法,您可以使用点表示法访问其属性,例如stock.name,stock.last,stock.change_value等。
感谢您阅读本指南,希望对您有所帮助。
随时通过HackerNoon上列出的任何社交媒体与我联系。
有用的链接:
- 完整的代码存储库: https : //github.com/kazumaki/stock-market-watcher
- TradingView网站: https ://www.tradingview.com/
- Nokogiri文档: https ://nokogiri.org/rdoc/index.html
翻译自: https://hackernoon.com/how-to-create-a-stock-market-price-watcher-using-ruby-591l3vx8
ruby map创建