# Ruby 數(shù)據(jù)抓取寫入 xls (unirest, nokogiri, spreadsheet)

安裝 unirest

使用 python 進(jìn)行數(shù)據(jù)請(qǐng)求酌呆,我們可以使用 opne-uri,但是進(jìn)行各種類型的請(qǐng)求時(shí)淑掌,顯得不是特別的方便快捷,所以我們使用unirest來進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求。

gem install unirest // 安裝 unirest

unirest 的用法

uinirest最低支持 Ruby2.0版本翰蠢,使用起來十分的簡(jiǎn)單项乒,常用的方法有下面幾個(gè) (具體的使用方法可以看unirest.io)

創(chuàng)建請(qǐng)求

response = Unirest.post "http://httpbin.org/post", 
                        headers:{ "Accept" => "application/json" }, 
                        parameters:{ :age => 23, :foo => "bar" }

response.code # Status code
response.headers # Response headers
response.body # Parsed body
response.raw_body # Unparsed body

異步請(qǐng)求

response = Unirest.post "http://httpbin.org/post", 
                        headers:{ "Accept" => "application/json" }, 
                        parameters:{ :age => 23, :foo => "bar" } {|response|
    response.code # Status code
    response.headers # Response headers
    response.body # Parsed body
    response.raw_body # Unparsed body
}

基本 get 請(qǐng)求

response = Unirest.get "http://httpbin.org/get", auth:{:user=>"username", :password=>"password"}

安裝 nokogiri

當(dāng)我們爬取到數(shù)據(jù)后,我們需要對(duì)數(shù)據(jù)進(jìn)行分析梁沧,如果是簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)我們可以直接使用正則表達(dá)式檀何,如果數(shù)據(jù)的結(jié)構(gòu)比較復(fù)雜,我們就需要使用 nokogiri 對(duì) html 的 dom 進(jìn)行操作廷支,如果對(duì) dom 結(jié)果不了解可以先查看相關(guān)的內(nèi)容(html dom教程)[http://www.runoob.com/htmldom/htmldom-tutorial.html]

gem install nokogiri

nokogiri 使用

導(dǎo)入包

require 'rubygems'
require 'nonogiri'

打開一個(gè) html 文檔

page = Nokogiri::HTML(open("index.html))
puts page.class # => Nokogiri::HTML::Document

# 你也可以直接使用 unirest 請(qǐng)求下來的數(shù)據(jù) response.body 來進(jìn)行解析
response = Unirest.get "http://httpbin.org/get"
page = Nokogiri::HTML(response.body)

通過 open-uri 直接解析 url

通過 http 請(qǐng)求直接獲取到 document

require 'rubygems'
require 'nokogiri'
require 'open-uri'
   
page = Nokogiri::HTML(open("http://en.wikipedia.org/"))   
puts page.class   # => Nokogiri::HTML::Document

CSS 選擇器

對(duì) Document 對(duì)象進(jìn)行節(jié)點(diǎn)分析

page.css('title') # 查找 page 下所有的 `title` 標(biāo)簽, 返回的是一個(gè)數(shù)組
page.css('li')[0].text # 獲取 page 下第一個(gè) `li` 標(biāo)簽中的內(nèi)容
page.css('li')[0]['href'] # 獲取第一 `li` 標(biāo)簽中屬性 `href` 的值
page.css("li[data-category='news']") #獲取屬性有 `data-category='news'` 的 `li` 標(biāo)簽
page.css('div#funstuff')[0] #獲取標(biāo)簽 `id='funstuff'` 的節(jié)點(diǎn)
page.css('div#reference a') # 獲取標(biāo)簽 `id='reference'` 下所有的 `a` 節(jié)點(diǎn) 

更多的關(guān)于 nokogiri 的信息可以通過Parsing HTML with Nokogiri進(jìn)行了解

安裝 spreadsheet

Spreadsheet是一個(gè)Ruby實(shí)現(xiàn)的gem频鉴,它可以使我們很方便的使用它對(duì)excel進(jìn)行操作,我們需要將獲取到的數(shù)據(jù)存入本地恋拍,方便數(shù)據(jù)的記錄和后續(xù)處理垛孔。

# 引入spreadsheet插件
require "spreadsheet"

# 聲明Spreadsheet處理Excel文件組時(shí)的編碼
Spreadsheet.client_encoding = "UTF-8"

# 創(chuàng)建一個(gè)Spreadsheet對(duì)象,它相當(dāng)于Excel文件
book = Spreadsheet::Workbook.new
# 創(chuàng)建Excel文件中的一個(gè)表格施敢,并命名為 "Test Excel"
sheet1 = book.create_worksheet :name => "Test Excel"

# 設(shè)置一個(gè)Excel文件的格式
default_format = Spreadsheet::Format.new(:weight => :bold,#字體加粗
                             :size => 14, 
                             :horizontal_align: => :merge, #表格合并
                             :color=>"red", 
                             :border=>1, 
                             :border_color=>"black",
                             :pattern => 1 ,
                             :pattern_fg_color => "yellow" )#這里需要注意周荐,如果pattern不手動(dòng)處理,會(huì)導(dǎo)致pattern_fg_color無實(shí)際效果

# 指定一個(gè)在表格中的第一行對(duì)象
test_row = sheet1.row(0)
test_row.set_format(i, default_format)

# 為第一行的第一列指定值
test_row[0] = "row 1 col 1"
# 為第一行的第二列指定值
test_rwo[1] = "row 1 col 2" 

# 將創(chuàng)建的Spreadsheet對(duì)象寫入文件僵娃,形成電子表格
book.write 'book2.xls'

爬蟲

爬取 RUNOOB.COM(http://www.runoob.com/) 的教程列表和地址數(shù)據(jù)
其實(shí)這都算不上是一個(gè)爬蟲概作,但是作為利用 ruby 的各種 gem 來實(shí)現(xiàn)異步數(shù)據(jù)請(qǐng)求,數(shù)據(jù)篩選及存儲(chǔ)默怨。是實(shí)現(xiàn)一個(gè)更加復(fù)雜的爬蟲的必備工具讯榕。熟練的使用各種各樣的 gem 可以體現(xiàn) ruby 的簡(jiǎn)潔

#!/usr/bin/ruby
require 'unirest'
require 'nokogiri'
require 'open-uri'
require 'spreadsheet'

# 獲取網(wǎng)頁的信息
response = Unirest.get "http://www.runoob.com/"
page = Nokogiri::HTML(response.body)

# 獲取大分類的列表
datas = page.css('div.codelist')
puts datas.count

# 創(chuàng)建一個(gè)表格
Spreadsheet.client_encoding = 'UTF-8'
book = Spreadsheet::Workbook.new

# 創(chuàng)建一個(gè) sheet
sheet = book.create_worksheet :name => "my excel"

index = 0
datas.each do |category|
    puts category.css('h2').text # 獲取大分類的名字
    items = category.css('a.item-top') 
    items.each do |item|        
        sheet.row(index)[0] = item.css('h4').text # 寫入教程的名字
        sheet.row(index)[1] = item['href'] # 寫入教程的鏈接
        index += 1
    end
end

book.write '/users/ssbun/desktop/runoob.xls' # 寫入本地文件 (**注意你的路徑**)

隨后你就可以看見在你的桌面上有一個(gè) xls 文件,打開它就能看到里面的數(shù)據(jù)了匙睹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愚屁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痕檬,更是在濱河造成了極大的恐慌集绰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆棺,死亡現(xiàn)場(chǎng)離奇詭異栽燕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)改淑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門碍岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朵夏,你說我怎么就攤上這事蔼啦。” “怎么了仰猖?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵捏肢,是天一觀的道長(zhǎng)奈籽。 經(jīng)常有香客問我,道長(zhǎng)鸵赫,這世上最難降的妖魔是什么衣屏? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮辩棒,結(jié)果婚禮上狼忱,老公的妹妹穿的比我還像新娘。我一直安慰自己一睁,他們只是感情好钻弄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著者吁,像睡著了一般窘俺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上复凳,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天批销,我揣著相機(jī)與錄音,去河邊找鬼染坯。 笑死均芽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的单鹿。 我是一名探鬼主播掀宋,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仲锄!你這毒婦竟也來了劲妙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤儒喊,失蹤者是張志新(化名)和其女友劉穎奥吩,沒想到半個(gè)月后鸵闪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體世澜,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挫酿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芯义。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哈垢。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扛拨,靈堂內(nèi)的尸體忽然破棺而出耘分,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布求泰,位于F島的核電站央渣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏渴频。R本人自食惡果不足惜芽丹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枉氮。 院中可真熱鬧,春花似錦暖庄、人聲如沸聊替。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惹悄。三九已至,卻和暖如春肩钠,著一層夾襖步出監(jiān)牢的瞬間泣港,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工价匠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留当纱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓踩窖,卻偏偏與公主長(zhǎng)得像坡氯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洋腮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容