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).

相关文章
相关标签/搜索