使用Ruby with Mechanize登录网站

我需要从网站上抓取数据,但首先需要登录。 我一直在使用hpricot成功地抓住其他网站,但我是新手使用机械化,我真的很困惑如何工作。

我看到这个例子通常被引用:

require 'rubygems' require 'mechanize' a = Mechanize.new a.get('http://rubyforge.org/') do |page| # Click the login link login_page = a.click(page.link_with(:text => /Log In/)) # Submit the login form my_page = login_page.form_with(:action => '/account/login.php') do |f| f.form_loginname = ARGV[0] f.form_pw = ARGV[1] end.click_button my_page.links.each do |link| text = link.text.strip next unless text.length > 0 puts text end end 

但我发现它非常神秘。 我不明白的部分是这里发生了什么:

 f.form_loginname = ARGV[0] f.form_pw = ARGV[1] 

来自页面的那些输入标签突然变成了方法? 我在这里错过了什么吗? 当我尝试重新创建它时,要登录到AppDataPro(http://www.appdata.com/login),我遇到输入名称包含括号的问题,如下所示:

 


这是我尝试使用机械化:

  a = Mechanize.new a.get('http://www.appdata.com/login') do |page| # Click the login link login_page = a.click(page.link_with(:text => /Login/)) #login_page is basically a doc of appdata/login my_page = login_page.form_with(:action => '/login') do |f| f.user_session[username] = '****username here?****' f.user_session[password] = '****password here?****' end end 

但它会导致错误,

 logintest01.rb:21:in `block (2 levels) in ': undefined method `user_session' for nil:NilClass (NoMethodError) 

我正在做什么有什么问题?

这是我经常采用的方法。 它没有让我失望:

 username_field = form.field_with(:name => "user_session[username]") username_field.value = "whatever_user" password_field = form.field_with(:name => "user_session[password]") password_field.value = "whatever_pwd" form.submit 

试试没有这个

 login_page = a.click(page.link_with(:text => /Login/)) 

要么

 a.get('http://www.appdata.com/') do |page|