我需要从网站上抓取数据,但首先需要登录。我一直在使用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),我遇到输入名称包含括号的问题,如下所示:
<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)
我在做什么有什么问题?
答案 0 :(得分:14)
这是我经常采用的方法。它没有让我失望:
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
答案 1 :(得分:0)
试试没有这个
login_page = a.click(page.link_with(:text => /Login/))
或者
a.get('http://www.appdata.com/') do |page|