Mechanize使用手冊

開始使用 [WWW::Mechanize](http://mechanize.rubyforge.org/mechanize/classes/WWW/Mechanize.html)
—————————
本教程的目的是幫助你開始使用Mechanize。讀完這篇教程以後,你將能夠抓取頁面,點擊連接,填寫和提交form,抽取數據和其餘一些可能有用的事情。此教程僅僅只是涉及到了很是粗淺的功能,但因該已經足夠幫助你起步了。
讓咱們抓取一個頁面
—————–
你要作得第一件事情就是在代碼裏引用mechanize,而後初始化一個新的mechanize實例: html


require 'rubygems'
require 'mechanize' 
 agent = WWW::Mechanize.new


如今咱們將使用剛剛建立的agent來抓取一個頁面。就拿Google開刀吧: ruby

page = agent.get('http://google.com/')

發生了什麼事情?咱們讓mechanize去抓取Google的主頁。Mechanize會自動存貯相關的cookie,甚至會跟蹤Google發過來的自動跳轉。Agent會幫咱們抓回來一個頁面,咱們能夠用來抽取數據,找到而且點擊連接或者填寫一個form. cookie

接下來,讓咱們找一些連接出來點點看。
找到連接
——–
當你抓取頁面、提交數據或者提交一個form的時候mechanzie都回返回一個page,agent將會解析抓取到的頁面而且把一系列的連接放進page裏面。
如今讓咱們嘗試從剛纔拿到的google主頁上找出全部的連接: post

page.links.each do |link| puts link.text end


咱們能列出全部的連接,可是mechanize提供了幾個更加方便的捷徑幫咱們找到一個連接而且點擊它。假設咱們須要找到一個text屬性是’News’的連接而且點擊。通常來講,咱們會這樣作: ui

page = agent.click page.links.find { |l| l.text == 'News' }


可是mechanize提供了捷徑,因此咱們能夠這樣作: google

page = agent.click page.links.text('News')


這個捷徑表示「找到全部text爲’News’的連接」。你也許已經想到了「可能存在不少符合這個條件的連接」,沒錯!若是你把一組連接發送給「click」方法,mechanize只會點擊第一個。若是你想要點擊第二個,那你應該這樣作: url

agent.click page.links.text('News')[1]


咱們甚至能夠找到一個包含特定href的連接: spa

page.links.href('/something')


或者把它們連起來,找到一個包含特定text和href的連接: .net

page.links.text('News').href('/something')


Mechanize提供的這些捷徑能夠用在任意一組你找到的東西上面,例如一組frame、iframe或者form。如今你應該已經知道如何找到而且點擊連接了,讓咱們試試更加複雜的事情,好比填寫一個form。
填寫Form
———
讓咱們繼續Google的例子。當前咱們有了一下代碼: code


require 'rubygems' 
require 'mechanize' 
agent = WWW::Mechanize.new 
page = agent.get('http://google.com/')


若是咱們打印這個頁面的源代碼,就會發現有一個form叫作’f',它包含幾個按鈕和幾個要填寫的域:

pp page


如今咱們知道了這個form的名字,讓咱們把它抓出來:

google_form = page.form('f')


Mechanize可讓你經過幾種不一樣的方式訪問form裏面能夠輸入的域,可是最方便的方式就是把輸入域看成form的一個屬性來訪問。因此讓咱們把一個叫作’q'的域的值設置成’ruby mechanize’:

google_form.q = 'ruby mechanize'


爲了確保咱們設置了這個值,讓咱們打印這個form,而後你應該能看到一行相似的代碼:

#<www::Mechanize::Field:0x1403488 @name="q", @value="ruby mechanize">


若是你看到’q'的值變了,說明你成功了!如今咱們能夠提交這個form,’點擊’提交按鈕和打印結果:

page = agent.submit(google_form, google_form.buttons.first) pp page


咱們剛剛作得事情等同於在google的搜索框裏填寫了’ruby mechanize’而後點擊’Google Search’按鈕。若是咱們沒有點擊那個按鈕而直接提交form,就等同於填寫值以後按回車鍵。
讓咱們看看到如今爲止寫的代碼:

require 'rubygems' 
require 'mechanize'              
agent = WWW::Mechanize.new 
page = agent.get('http://google.com/') 
google_form = page.form('f') 
google_form.q = 'ruby mechanize' 
page = agent.submit(google_form) 
pp page

在開始抓抽取數據以前,讓咱們深刻了解一下form。除非你對數據抓取實在感興趣。
高級form技巧
————
在這一節裏,我想試試form裏面可能包含的各類輸入控件。Password和Textarea能夠直接看成text控件來處理。Select很是相似 text,可是它會包含不少相關的子選項。若是你選擇了一個option,mechanize會取消其餘option的選擇(除非容許多選!)。
例如,在一個列表裏面選擇一個option:

form.fields.name('list').options[0].select


如今讓咱們來看看checkbox和radio button。要選擇一個checkbox,只須要這樣作:

form.checkboxes.name('box').check


Radio button和checkbox很像,可是在選擇一個radio button以後其餘同名的radio button都會被取消選擇。像操做checkbox同樣操做radio button。

form.radiobuttons.name('box')[1].check


Mechanize一樣能夠輕易支持文件上傳!只須要找到上傳文件的控件,而後告訴它你想要上傳的文件名:

form.file_uploads.file_name = "somefile.jpg"


抽取數據
——–
Mechanize使用hpricot來解析html。這表明了什麼?你能夠把mechanize的page看成一個hpricot對象。在你用 machanize找到目標頁面以後,就可使用[hpricot](http://code.whytheluckystiff.net /hpricot/)的方法來抽取上面的任何東西:

agent.get('http://someurl.com/').search("//p[@class='posted']")


更多關於這個強悍的數據抽取器的信息,請參考[HpricotBasics](http://code.whytheluckystiff.net/hpricot/wiki/HpricotBasics).

相關文章
相關標籤/搜索