【问题标题】:Maintaining cookies between Mechanize requests在 Mechanize 请求之间维护 cookie
【发布时间】:2011-10-26 04:02:16
【问题描述】:

我正在尝试使用 Ruby 版本的 Mechanize 从我们正在远离的不提供 API 的工单管理系统中提取我雇主的工单。

问题是,Mechanize 似乎没有在post 调用和get 调用之间保留 cookie,如下所示:

require 'rubygems'
require 'nokogiri'
require 'mechanize'

@agent = Mechanize.new

page = @agent.post('http://<url>.com/user_session', {
                                            'authenticity_token' => '<token>',
                                            'user_session[login]' => '<login>',
                                            'user_session[password]' => '<password>',
                                            'user_session[remember_me]' => '0',
                                            'commit' => 'Login'
})

page = @agent.get 'http://<url>.com/<organization>/<repo-name>/tickets/1'
puts page.title

user_session 是该站点的登录页面 POST 的 URL,我已经验证这确实让我登录了。但是从 get 调用返回的页面是“糟糕,你没有登录在!'页面。

我已验证从post 调用返回的页面上的clicking 链接有效,但如果没有JavaScript,我实际上无法到达我需要去的地方。当然,我在浏览器上使用相同的登录名成功完成了此操作。

我做错了什么?

【问题讨论】:

    标签: ruby screen-scraping mechanize


    【解决方案1】:

    好的,这可能会对您有所帮助 - 首先,您使用的是什么版本的机械化?您需要确定此问题是否是由于请求之间的机械化覆盖/清理了 cookie,或者是否首先设置了 cookie 错误/未设置。您可以通过在两个请求之间添加puts @agent.cookie_jar.jar 来做到这一点,以查看存储的内容。

    如果是覆盖问题,您可以通过从第一个请求中收集 cookie 并将它们应用于第二个请求来解决它。有很多方法可以做到这一点:

    一种方法是只做一个temp_jar = agent.cookie_jar.jar 然后只检查每个cookie 并使用.add 方法再次添加它

    但是 - 最简单的方法是安装 mechanize 的最新 2.1 预发行版(许多修复),因为这样您就可以非常简单地完成它。 要安装最新的gem install mechanize --pre,并确保在此之后摆脱旧版本的机械化gem uninstall mechanize 'some_version',您可以简单地执行以下操作:

    require 'rubygems'
    require 'nokogiri'
    require 'mechanize'
    
    @agent = Mechanize.new
    
    page = @agent.post('http://<url>.com/user_session', {
                                            'authenticity_token' => '<token>',
                                            'user_session[login]' => '<login>',
                                            'user_session[password]' => '<password>',
                                            'user_session[remember_me]' => '0',
                                            'commit' => 'Login'
    })
    temp_jar = @agent.cookie_jar
    #Do whatever you need an use the cookies again in a new session after that
    @agent = Mechanize.new
    @agent.cookie_jar = temp_jar
    
    page = @agent.get 'http://<url>.com/<organization>/<repo-name>/tickets/1'
    puts page.title
    

    顺便说一句,文档在这里http://mechanize.rubyforge.org/index.html

    【讨论】:

    • 这很糟糕,为什么需要一个新的机械化实例?
    • @DitmarWendt 这只是一个示例,如何在执行登录后重新使用之前获得的 cookie。
    【解决方案2】:

    Mechanize 会自动发送从连续请求的响应中获得的 cookie。您可以使用相同的代理而无需重新更新。

    require 'mechanize'
    
    @agent = Mechanize.new
    @agent.post(create_sessions_url, params, headers)
    @agent.get(ticket_url)
    

    mechanize 2.7.6测试。

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2016-08-21
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多