mechanize:Cookie混淆问题?

2 投票
1 回答
803 浏览
提问于 2025-04-17 12:58

我正在使用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 对象,每个对象都有自己独立的饼干罐。

撰写回答