Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby和Mechanize登录网站_Ruby_Login_Screen Scraping_Mechanize_Hpricot - Fatal编程技术网

使用Ruby和Mechanize登录网站

使用Ruby和Mechanize登录网站,ruby,login,screen-scraping,mechanize,hpricot,Ruby,Login,Screen Scraping,Mechanize,Hpricot,我需要从网站上抓取数据,但这需要我先登录。我一直在使用hpricot成功地抓取其他网站,但我对使用mechanize还不熟悉,我真的对如何使用它感到困惑 我看到这个例子经常被引用: require 'rubygems' require 'mechanize' a = Mechanize.new a.get('http://rubyforge.org/') do |page| # Click the login link login_page = a.click(page.link_wi

我需要从网站上抓取数据,但这需要我先登录。我一直在使用hpricot成功地抓取其他网站,但我对使用mechanize还不熟悉,我真的对如何使用它感到困惑

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

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> 
但这会导致错误

logintest01.rb:21:in `block (2 levels) in <main>': undefined method `user_session' for nil:NilClass (NoMethodError)
logintest01.rb:21:in'block(2层)in:nil:NilClass(NoMethodError)的未定义方法'user\u session'
我现在做的有什么问题吗?

试着不用这个

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


这是我通常采取的方法。这并没有让我失望:

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
a.get('http://www.appdata.com/') do |page|
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