Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp 语言。由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生石pearl(珍珠)相同,因此Ruby以7月诞生石ruby(红宝石)命名。

Ruby 的发明者是日本的松本行弘 Yukihiro “matz” Matsumoto,混合了他喜欢的语言(Perl、 Smalltalk、 Eiffel、 Ada 和 Lisp ) 产生了一种具有函数式及指令程序设计特性的新语言。他常说,他是“试着让 Ruby 更自然,而不是简单,就像生活一样”。

除此之外,他还提到:Ruby 就像人的身体一样,表面上看来简单,但是内部却相当的复杂.

在 1993 年,没有人会相信一个由日本业余语言设计者创建的面向对象的语言,能最终在世界范围内被广泛使用并且变得几乎像 Perl 那样流行。自从 1995 年 Ruby 公开发表以来,Ruby 在全球吸引了许多忠实的程序设计员。在 2006 年,Ruby 被广泛接受。在各大城市都有活跃的使用者并通过社区举办许许多多场场爆满的研讨会。

在 TIOBE, 最流行的开发语言排名调查中, Ruby 排名为全球第 11 位。 根据这样的成长情况,他们预测“在半年之中 Ruby 将会进入最受欢迎开发语言的前 10 名。”有越来越多受欢迎的软件如 Ruby on Rails web framework 是使用 Ruby 撰写而成,也是造成 Ruby 如此快速成长的原因。

Ruby 是开源软件, 不只是免费,而且可以自由的使用、复制、修改与发布。

 

Ruby 官网http://www.ruby-lang.org

 

Ruby 特点

  • Ruby 是开源的,在Web 上免费提供,但需要一个许可证。

  • Ruby 是一种通用的、解释型的编程语言。

  • Ruby 是一种真正的面向对象编程语言。

  • Ruby 是一种类似于 Python 和 Perl 的服务器端脚本语言

  • Ruby 可以用来编写通用网关接口(CGI)脚本。

  • Ruby 可以被嵌入到超文本标记语言(HTML)。

  • Ruby 语法简单,这使得新的开发人员能够快速轻松地学习 Ruby。

  • Ruby 与 C++ 和 Perl 等许多编程语言有着类似的语法。

  • Ruby 可扩展性强,用 Ruby 编写的大程序易于维护。

  • Ruby 可用于开发的 Internet 和 Intranet 应用程序

  • Ruby 可以安装在 Windows 和 POSIX 环境中。

  • Ruby 支持许多 GUI 工具,比如 Tcl/Tk、GTK 和 OpenGL。

  • Ruby 可以很容易地连接到 DB2、MySQL、Oracle 和 Sybase

  • Ruby 有丰富的内置函数,可以直接在 Ruby 脚本中使用。

 

Ruby 安装

方式1)命令安装:

sudo apt-get install ruby-full       // Debian or Ubuntu

sudo yum install ruby                // CentOS, Fedora, or RHEL

brew install ruby                    // Mac OS X

pkg install runtime/ruby-18          // Solaris and OpenIndiana

sudo pacman -S ruby                  // pacman (Arch Linux)

sudo emerge dev-lang/ruby            // portage (Gentoo)

 

方式2)源码安装

下载 ruby-2.4.1.tar.gz

tar ruby-2.4.1.tar.gz
cd ruby-2.4.1/
./configure
sudo make 
sudo make install

 

验证安装成功:
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]

 

Ruby 语法

Ruby的变量有一定的规则,

以$开头的一定是全局变量,

以@开头的都是实例变量,

以@@开头的是类变量。

常数则以大写字母开头;这种方法,对文本编辑器的命令补全很有帮助,如在vim下先键入$及开头字母,再敲击Ctrl+p,则可专门补全本文件以及关联文件中的全局变量,perl与php亦有此优点。

 

Ruby 使用

1. hello 示例

vim  hello.rb

#!/usr/bin/env ruby
puts "hello mimvp.com"

执行命令:

$ ruby hello.rb 
hello mimvp.com

 

2. 函数类示例

Ruby是动态语言,你可以在程序中修改先前定义过的类。

也可以在某个类的实例中定义该实例特有的方法,这叫做单例方法。

vim  mimvp_class.rb

#!/usr/bin/env ruby
#
# mimvp.com
# 2009.8.30

class MyClass
  def the_method
    puts "hello mimvp.com"
  end
end

mc = MyClass.new

def mc.the_method
  puts "hello proxy.mimvp.com"
end

mc.the_method   # hello proxy.mimvp.com

 

3. Ruby 爬取网页

vim  mimvp_spider.rb

#!/usr/bin/env ruby
#
# mimvp.com
# 2009.8.30

require 'net/http'

## 方式1
h = Net::HTTP.new("mimvp.com",80)   # 必须为 mimvp.com,不可以为 http://mimvp.com
resp,data = h.get("/")

puts data         # 空
puts resp         # #<Net::HTTPOK:0x007f99e18f2cf8>
puts resp.body    # 网页正文


## 方式2
resp = Net::HTTP.get_response(URI("http://mimvp.com"))  # 必须为 http://mimvp.com,不可以为 mimvp.com
puts resp         # #<Net::HTTPOK:0x007fe04301a650>
puts resp.body    # 网页正文  


## 方式3  运行时需传入参数: ruby mimvp-proxy-ruby.rb mimvp.com
require 'uri'  
require 'timeout'  
require 'net/http'  
  
$resp = $data = nil  
  
begin  
    timeout(5) {  
        $resp = Net::HTTP.new(ARGV[0],80).get("/")                    # 方式1
        $resp = Net::HTTP.get_response(URI("http://"+ARGV[0]+"/"))    # 方式2
    }  
rescue => e  
    puts e.inspect  
    exit  
end   
puts $resp.body  

# 运行命令: ruby mimvp-proxy-ruby.rb mimvp.com

 

class Net::HTTP 官方文档: 

https://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html

 

Ruby 代理设置

vim mimvp-proxy-ruby.rb

#!/usr/bin/env ruby
#
# Ruby 支持 http
#
# 米扑代理示例:
# http://proxy.mimvp.com/demo2.php
# 
# 米扑代理购买:
# http://proxy.mimvp.com
# 
# mimvp.com
# 2017-03-21


require 'rubygems' 
require 'net/http' 
require 'open-uri' 
require 'timeout' 


mimvp_url = "http://proxy.mimvp.com/exist.php"
mimvp_url2 = "https://proxy.mimvp.com/exist.php"
mimvp_url3 = "https://apps.bdimg.com/libs/jquery-i18n/1.1.1/jquery.i18n.min.js"

$proxy = '183.222.102.95:8080'

$proxy_addr = $proxy.split(':')[0].strip
$proxy_port = $proxy.split(':')[1].strip

puts $proxy_addr
puts $proxy_port


begin 
  Timeout.timeout(30) {
    
    # mimvp_url = http://proxy.mimvp.com/exist.php
    # uri.host = proxy.mimvp.com
    # uri.port = 80
    # uri.path = /exist.php
    uri = URI.parse(mimvp_url)
    result = Net::HTTP.new(uri.host, nil, $proxy_addr, $proxy_port).start { |http|
      http.get(uri.path)
    }
    puts result.body
  

    # mimvp_url = http://proxy.mimvp.com/exist.php
    # uri.host = proxy.mimvp.com
    # uri.port = 80
    # uri.path = /exist.php
    # req = #<Net::HTTP::Get:0x007fafa594ff78>
    uri = URI.parse(mimvp_url)
    req = Net::HTTP::Get.new(uri.path)
    result = Net::HTTP::Proxy($proxy_addr, $proxy_port).start(uri.host, uri.port) {|http| 
      http.request(req)
    } 
    puts result.body
    
    
#    # proxy auth (NO TEST)
#    $proxy_addr = '<proxy addr>'
#    $proxy_port = '<proxy_port'
#    $proxy_user = '<username>'                # 代理用户名
#    $proxy_pass = '<password>'                # 代理密码
#    
#    $website_username = '<website_username>'  # 目标网站登录用户名
#    $website_password = '<website_password>'  # 目标网站登录密码
#    
#    uri = URI.parse(mimvp_url)
#    req = Net::HTTP::Get.new(uri.path)
#    req.basic_auth($website_username, $website_password)
#    
#    result = Net::HTTP::Proxy($proxy_addr, $proxy_port, $proxy_user, $proxy_pass).start(uri.host, uri.port) {|http| 
#      http.request(req)
#    } 
#    puts result.body
    
}
rescue => e  
    puts e.inspect  
    exit  
end 

运行命令:

ruby mimvp-proxy-ruby.rb

 

 

参考推荐:

说说设计,谈谈Ruby

Python scrapy 安装与开发

Python requests 安装与开发

Python pyspider 安装与开发

Python3 urllib 用法详解

PhantomJS 安装与开发

Node.js 安装与开发