2011-07-08 4 views
5

サイトからデータを抜き取る必要がありますが、最初にログインする必要があります。私はhpricotを使って他のサイトを削り取ってきましたが、私はmechanizeを初めて使用していました。私は本当にそれを動作させる方法に困惑しています。MechanizeでRubyを使用してウェブサイトにログインする

私は、一般的に引用され、この例を参照してください。

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)にログインし、それを再作成しようとすると、私はこのように、入力された名前は角かっこが含まれていることを問題に遭遇:

<Table> 
<tr><td width="150"> 
    <label for="user_session_username">Username</label><br /> 
</td><td > 
    <input id="user_session_username" name="user_session[username]" size="30" type="text" /> 
</td></tr> 
<tr><td> 
    <label for="user_session_password">Password</label><br /> 
</td><td> 
    <input id="user_session_password" name="user_session[password]" size="30" type="password" /> 
</td></tr> 
</table> 

これは私の試みです

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 <main>': undefined method `user_session' for nil:NilClass (NoMethodError) 

、エラーの原因:Mechanizeのを使用するには?

答えて

13

なしこれは私が通常取るアプローチです。それは私を失敗させていません:

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 
+0

ありがとうございました!これは完全に動作します! – Spacew00t

+0

ようこそ。 – Senthess

0

てみてください。この

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

それとも

a.get('http://www.appdata.com/') do |page| 
関連する問題