我正在使用mechanize从不同的代理访问同一个网站。该网站有一个登录页面。我有5个代理和5个不同的登录,一个用于每个代理。
如果我只使用一个代理和一个登录来运行我的脚本,那么每个都可以正常工作。但是,如果我一次运行两个或多个代理/登录,那么我开始收到错误(来自网站),例如“您的会话已超时或未启用Cookie”。无论我是从同一个脚本(相同的进程)运行5个实例,还是从不同的脚本(不同的进程)运行,都会发生这种情况。
什么会导致这个问题单独起作用,而不是一次全部起作用?
答案 0 :(得分:2)
这是因为默认情况下,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罐。