Использование Ruby с Mechanize для входа на сайт - PullRequest
5 голосов
/ 08 июля 2011

Мне нужно почистить данные с сайта, но для этого нужно сначала войти в систему.Я использовал 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> 

Это моя попытка использовать mechanize:

    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)

Что не так с тем, что я делаю?

Ответы [ 2 ]

14 голосов
/ 09 июля 2011

Это подход, который я обычно использую.Это не подвело меня:

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 голосов
/ 09 июля 2011

Попробуйте без этого

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

Или

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