安裝 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ù)了匙睹。