文章会有【原创】或者【转载】标示,部分来自Google Baidu的学习结果 {Java/PHP/Python/Ruby/Go}

Ruby的在工作项目中使用的一些总结【原创】  


以前看一些Ruby的内容,但是没用在项目中。

这次在抓取中使用了Ruby。具体环境Ruby 1.8.7 Ruby Gem 1.8.7。可以使用ruby -v 和 gem -v的版本。

我这里使用了Ruby的hpricot ,后来搜索了又发现一个nokogiri,据nokogiri的介绍说比hpricot快7倍以上,这里我没做过测试。PHP也有(QueryPath)http://www.oschina.net/p/querypath,没测试过。

接下来安装一些抓取脚本中使用的gem包。(MySQL MemCache Hprico) 安装完毕gem list就可以看到安装列表。

gem install memcache-client

gem install mysql

gem install hpricot

Ruby 的语法和 Python 的语法很相近。例如。就是一个少了end,一个多了:号。

Python:

if a == "p":

     print 'p'

Ruby:

if a == "p"

    puts 'p'

end

等。

举例使用在项目当中类似代码:

require "rubygems" #rubygem >= 1.8.7
require 'open-uri' #curl
require 'hpricot' #xml
require 'memcache' #memcache
require 'memcache_util'
require 'md5' #md5 memkey
require 'mysql' #mysql

class Tuanapi
   #构造函数
   def initialize(memcache,myconn)
      @memcache = memcache
      @myconn = myconn
   end

   #主函数
   def run
      ...省略部分代码
      doc = Hpricot::XML(apixml)
         (doc/:url).each do | url |
            #API的XML结构
            #URL的修改
            yprjurl = (url/:loc).text
            if nid.to_i == 14 #美团
               prjurl = yprjurl.gsub("http://www.meituan.com/bdt_redirect.php?url=", '') #美团的有个前缀,需要去掉
            elsif nid.to_i == 1261 #窝窝团
               prjurl = yprjurl.gsub("?from=daohang-hao123-tgny", '') #窝窝团的去掉
            elsif nid.to_i == 1263 #满座
               prjurl = yprjurl.gsub("?campaign=hao123", '') #满座团的去掉
            elsif nid.to_i == 1294 #爱帮
               prjurl = yprjurl.gsub("?utm_source=hao123&utm_medium=referral", '') #爱帮团的去掉
            elsif nid.to_i == 1408 #OL圈
               prjurl = yprjurl.gsub("&t=nav&v=baidu", '') #OL圈的去掉
            else
               prjurl = yprjurl
            end
            #URL的修改
            prjcate = (url/:data/:display/:sort).text
            prjtitle = (url/:data/:display/:title).text
            prjimg = (url/:data/:display/:image).text
            prjstime = (url/:data/:display/:startTime).text
            prjetime = (url/:data/:display/:endTime).text
            prjvalue = (url/:data/:display/:value).text
            prjprice = (url/:data/:display/:price).text
            prjrebate = (url/:data/:display/:rebate).text
            prjbought = (url/:data/:display/:bought).text
            prjcityid = (url/:data/:display/:city).text
            #增加购买人数
            prjbought = (url/:data/:display/:bought).text
   end
end

在PHP中就是数组,关联数组和索引数组。在Ruby中索引数组为数组,关联数组为哈希吧。

Ruby中遍历数组很简单类似于foreach

Ruby
a = ['php','ruby','python']
a.each do | v |
   puts v
end

哈希也一样

aa ={:one => "php",:two => "ruby",:three => "python"}
for k,v in aa
   puts "#{k} => #{v}"
end

aa.each do |k, v|
   puts "#{k} => #{v}"
end

在抓取具体项目页面中。代码片段

require "rubygems" #rubygem >= 1.8.7
require 'open-uri' #curl
require 'hpricot' #xml
require 'memcache' #memcache
require 'memcache_util'
require 'md5' #md5 memkey
require 'mysql' #mysql

class Tuanspider
   
   #构造函数
   def initialize(memcache,myconn,url,nid,cityid)
      @memcache = memcache
      @myconn = myconn
      @url = url
      @nid = nid
      @cityid = cityid
   end

   #运行函数
   def run
   ...省略代码
      #准备抓取的页面地址
      newurl = url
      for i in 1..60
           page = newurl + "" + i.to_s
           #项目地址
           html = Hpricot(open(page,'User-Agent' => 'ruby'))
           html.search("ul.deals-list").each do | item | #带分页
                (item/'h4'/'a').each do | elem |
                   url  = elem[:href]
                   rows = Hpricot(open(url,'User-Agent' => 'ruby'))
                   rows_title = rows.search("/html/body/div/div[2]/div/div[2]/div/div[2]/h1").inner_text #项目标题
                   rows_xj = rows.search("/html/body/div/div[2]/div/div[2]/div/div[2]/div/div/p/strong").first.inner_text #项目现价
                   rows_yj = rows.search("html body.bg-alt div#doc div#bdw.bdw div#bd.cf div#deal-default div#content div#deal-intro.cf div.main table.deal-discount tbody tr td del").inner_html #项目原价
                   rows_zk = rows.search("/html/body/div/div[2]/div/div/div/div[2]/div/table/tbody/tr[2]/td[2]").inner_html #项目折扣
                   rows_img = rows.search("/html/body/div/div[2]/div/div/div/div[2]/div[2]/div/img").inner_html #项目图片
                   rows_gmrs = rows.search("/html/body/div/div[2]/div/div[2]/div/div[2]/div/div[3]/p/strong").first.inner_text #项目购买人数
                   an = "Url:#{url},Title:#{rows_title},Price:#{rows_xj},Yj:#{rows_yj},Zk:#{rows_zk},Img:#{rows_img},Gmrs:#{rows_gmrs}"
                   puts an
                end
          end

"/html/body/div/div2/div/div2/div/div2/h1" 是XPATH路径。借助Firefox 的Firebug中的选取。可以获得页面的XPATH、CssPATH路径。然后获取。

这里需要注意的是在PHP中比较不分类型 例如"7"和7。在ruby中需要判断的时候转型一下例如转整型 "7".to_i ,数字转字符串 7.to_s。