开始使用 [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).