【问题标题】:mechanize: cookies getting mixed up?mechanize:饼干搞混了?
【发布时间】:2012-03-05 07:41:13
【问题描述】:

我正在使用 mechanize 从不同的代理访问同一个网站。该网站有一个登录页面。我有 5 个代理和 5 个不同的登录名,每个代理使用一个。

如果我只使用一个代理和一个登录来运行我的脚本,那么每个都可以正常工作。但是,如果我一次运行两个或多个代理/登录,那么我会开始收到错误(来自网站),例如“您的会话已超时或未启用 cookie”。无论我是从同一个脚本(同一个进程)还是从不同的脚本(不同的进程)运行 5 个实例,都会发生这种情况。

什么会导致它单独工作而不是一次全部工作?

【问题讨论】:

    标签: python cookies automation mechanize session-cookies


    【解决方案1】:

    这是因为 mechanize 默认情况下会自动创建一个共享的“cookie jar”。对于更高级的 cookie 处理选项,您必须为每个脚本会话创建自己的 cookie jar。

    我必须在过去的项目中使用自定义 cookie jar,以便将 cookie 从一个会话移动到另一个会话。最终结果是一样的,你的脚本的每个实例都有它自己唯一的文件来存储它的 cookie,所以你需要管理 cookie 文件并知道它们不会混淆。

    >>>> import mechanize
    
    >>>> cj1 = mechanize.CookieJar()
    >>>> cj2 = mechanize.CookieJar()
    >>>> mech1 = mechanize.OpenerFactory().build_opener(mechanize.HTTPCookieProcessor(cj1))
    >>>> mech2 = mechanize.OpenerFactory().build_opener(mechanize.HTTPCookieProcessor(cj2))
    
    >>>> request = mechanize.Request('http://example.com') # testing shows they can share a request
    
    >>>> response1 = mech1.open(request)
    >>>> response2 = mech2.open(request)
    
    >>>> print cj1
    <mechanize._clientcookie.CookieJar[<Cookie JSESSIONID=54FBB2BE99E4CFDA8F8386F52FCF59C3>]>
    >>>> print cj2
    <mechanize._clientcookie.CookieJar[<Cookie JSESSIONID=350C0D544CDAD344A1272DA8D7B016B0>]>
    

    在我测试过的这个例子中,你可以看到两个机械化对象,每个对象都有自己独立的 cookie jar。

    【讨论】:

    • 即使脚本在不同的进程中运行,它们共享一个cookie jar?我还对我的脚本执行了以下操作:“ `self.cj = mechanize.CookieJar(); self.mech = mechanize.Browser(factory=mechanize.RobustFactory()); self.mech.set_cookiejar(self.cj)`” ,并且发生了相同的行为。我也会按照您的方式尝试,但是我的方式不起作用是否有原因(cookie jar 或 hte 脚本?)
    • 我把我的代码一字不差地复制了一点,最后遗漏了一点。我已经修改和测试过,现在可以使用了。请参阅上面的更新。
    • 我如何将它与mechanize.Browser() 一起使用?我的代码已经使用了浏览器,如果可能的话,我宁愿不改变它。
    • 查看源码,不好看。 Browser 类完全抽象了cookie jar,这意味着它被很好地锁定在其中,并且不允许外部用户弄乱它。好的部分是它看起来只在一两个地方提到,所以你也许可以 fork 源代码,并制作一个可以显示 cookie jar 的 mechanize 版本,但这比改变要多得多停止使用 Browser 类的代码。
    • hmm 我确实看到了set_cookiejar 函数,但它似乎没有做任何事情。也就是说,我将它设置为两个不同的 cookie 罐,但它们似乎相互干扰。会按照你的方式尝试,看看会发生什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2015-03-07
    • 2015-06-06
    • 1970-01-01
    • 2017-02-09
    • 2010-12-29
    • 2020-12-30
    相关资源
    最近更新 更多