安裝 unirest
使用 python 進行資料請求,我們可以使用 opne-uri
,但是進行各種型別的請求時,顯得不是特別的方便快捷,所以我們使用unirest
來進行網路資料請求。
gem install unirest // 安裝 unirest
複製程式碼
unirest 的用法
uinirest最低支援 Ruby2.0版本,使用起來十分的簡單,常用的方法有下面幾個 (具體的使用方法可以看unirest.io)
建立請求
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
複製程式碼
非同步請求
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 請求
response = Unirest.get "http://httpbin.org/get", auth:{:user=>"username", :password=>"password"}
複製程式碼
安裝 nokogiri
當我們爬取到資料後,我們需要對資料進行分析,如果是簡單的資料結構我們可以直接使用正規表示式
,如果資料的結構比較複雜,我們就需要使用 nokogiri 對 html 的 dom 進行操作,如果對 dom 結果不瞭解可以先檢視相關的內容(html dom教程)[http://www.runoob.com/htmldom/htmldom-tutorial.html]
gem install nokogiri
複製程式碼
nokogiri 使用
匯入包
require 'rubygems'
require 'nonogiri'
複製程式碼
開啟一個 html 文件
page = Nokogiri::HTML(open("index.html))
puts page.class # => Nokogiri::HTML::Document
# 你也可以直接使用 unirest 請求下來的資料 response.body 來進行解析
response = Unirest.get "http://httpbin.org/get"
page = Nokogiri::HTML(response.body)
複製程式碼
通過 open-uri 直接解析 url
通過 http 請求直接獲取到 document
require 'rubygems'
require 'nokogiri'
require 'open-uri'
page = Nokogiri::HTML(open("http://en.wikipedia.org/"))
puts page.class # => Nokogiri::HTML::Document
複製程式碼
CSS 選擇器
對 Document 物件進行節點分析
page.css('title') # 查詢 page 下所有的 `title` 標籤, 返回的是一個陣列
page.css('li')[0].text # 獲取 page 下第一個 `li` 標籤中的內容
page.css('li')[0]['href'] # 獲取第一 `li` 標籤中屬性 `href` 的值
page.css("li[data-category='news']") #獲取屬性有 `data-category='news'` 的 `li` 標籤
page.css('div#funstuff')[0] #獲取標籤 `id='funstuff'` 的節點
page.css('div#reference a') # 獲取標籤 `id='reference'` 下所有的 `a` 節點
複製程式碼
更多的關於 nokogiri
的資訊可以通過Parsing HTML with Nokogiri進行了解
安裝 spreadsheet
Spreadsheet是一個Ruby實現的gem,它可以使我們很方便的使用它對excel進行操作,我們需要將獲取到的資料存入本地,方便資料的記錄和後續處理。
# 引入spreadsheet外掛
require "spreadsheet"
# 宣告Spreadsheet處理Excel檔案組時的編碼
Spreadsheet.client_encoding = "UTF-8"
# 建立一個Spreadsheet物件,它相當於Excel檔案
book = Spreadsheet::Workbook.new
# 建立Excel檔案中的一個表格,並命名為 "Test Excel"
sheet1 = book.create_worksheet :name => "Test Excel"
# 設定一個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不手動處理,會導致pattern_fg_color無實際效果
# 指定一個在表格中的第一行物件
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"
# 將建立的Spreadsheet物件寫入檔案,形成電子表格
book.write 'book2.xls'
複製程式碼
爬蟲
爬取 RUNOOB.COM(http://www.runoob.com/) 的教程列表和地址資料 其實這都算不上是一個爬蟲,但是作為利用 ruby 的各種 gem 來實現非同步資料請求,資料篩選及儲存。是實現一個更加複雜的爬蟲的必備工具。熟練的使用各種各樣的 gem 可以體現 ruby 的簡潔
#!/usr/bin/ruby
require 'unirest'
require 'nokogiri'
require 'open-uri'
require 'spreadsheet'
# 獲取網頁的資訊
response = Unirest.get "http://www.runoob.com/"
page = Nokogiri::HTML(response.body)
# 獲取大分類的列表
datas = page.css('div.codelist')
puts datas.count
# 建立一個表格
Spreadsheet.client_encoding = 'UTF-8'
book = Spreadsheet::Workbook.new
# 建立一個 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' # 寫入本地檔案 (**注意你的路徑**)
複製程式碼
隨後你就可以看見在你的桌面上有一個 xls 檔案,開啟它就能看到裡面的資料了。