mechanize:Cookie混淆问题?
我正在使用mechanize这个工具,通过不同的代理访问同一个网站。这个网站有一个登录页面。我有5个代理和5个不同的登录账号,每个代理对应一个登录账号。
如果我只用一个代理和一个登录账号来运行我的脚本,效果很好。但是,如果我同时运行两个或更多的代理和登录账号,就会开始出现错误,比如“你的会话已经超时或者没有启用Cookies。”无论我是从同一个脚本(同一个进程)运行5个实例,还是从不同的脚本(不同的进程)运行,都会出现这个问题。
为什么单独运行时可以,但同时运行就不行呢?
1 个回答
2
这是因为 mechanize 默认会自动创建一个共享的“饼干罐”。如果你想要更高级的饼干处理选项,就需要为每个脚本会话自己创建一个饼干罐。
我在之前的一个项目中需要使用自定义的饼干罐,以便将饼干从一个会话转移到另一个会话。最终的结果是,每个脚本实例都有自己独特的文件来存储饼干,所以你需要自己管理这些饼干文件,确保它们不会搞混。
>>>> 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>]>
在我测试的这个例子中,你可以看到两个 mechanize 对象,每个对象都有自己独立的饼干罐。