就是说呢,用 Mechanize 爬网页的时候遇到这样的问题,要提交登录表单,正常代码是这样:比方 bitbucket 吧
a = Mechanize.new
a.get('https://bitbucket.org/') do |page|
login_page = a.click(page.link_with(text: 'Log In'))
my_page = login_page.form_with(action: '/account/signin/') do |f|
f.username = '我的帐号' # 这个 f.username 里面的 'username' 是表单里面对应的 field 名
f.password = '我的密码' # 这个 f.password 里面的 'password' 是表单里面对应的 field 名
end.click_button
end
然后把它做成一个 method 的时候,我希望能传进两个参数 username_field_name 和 password_field_name,因为别的登录页面的表单里头的 field 可能不是叫 username 和 password。比如 WordPress 登录表单里面这两个 field 分别叫 log 和 pwd。
那么就是这样子:
# 这个 method 传进去的参数有几个,前面的无关紧要,最后一个 auth_info 是个 Hash ,里面包括表单的地址,两个 field name 和两个 field 里面要填的内容。
def website_login(..., auth_info)
a = Mechanize.new
a.get(auth_info[:login_page_url]) do |page|
land_page = page.form_with(action: auth_info[:login_form_action]) do |f|
# 于是以下两句不会写了......
????????
????????
# 我试过像以下两句这样,但是不行
f.instance_variable_set('@'+auth_info[:username_field_name], auth_info[:username])
f.instance_variable_set('@'+auth_info[:password_field_name], auth_info[:password])
end.click_button
end
请问这里应该怎么写才对呢?谢谢。