2012-02-13 36 views
2

我正在使用mechanize從不同的代理訪問相同的網站。該網站有一個登錄頁面。我有5個代理和5個不同的登錄,每個代理使用一個。機械化:餅乾混合起來?

如果我只用一個代理和一個登錄運行我的腳本,每個都可以正常工作。但是,如果我一次運行兩個或多個代理/登錄,那麼我開始從網站獲取錯誤,如「您的會話超時或未啓用Cookie」。無論是從同一個腳本(同一進程)還是從不同腳本(不同進程)運行5個實例,都會發生這種情況。

什麼會導致它單獨工作,但不是一次全部工作?

回答

2

這是因爲默認情況下機械化會自動創建一個共享的「餅乾罐」。對於更高級的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>]> 

在這個例子中,我測試過,你可以看到兩個機械化對象,每個都有它自己獨立的餅乾罐。

+0

即使腳本運行在不同的進程中,它們共享一個cookie jar?我也做了以下與我的腳本:「'self.cj = mechanize.CookieJar(); self.mech = mechanize.Browser(factory = mechanize.RobustFactory()); self.mech.set_cookiejar(self.cj)'」 ,併發生同樣的行爲。我會嘗試一下你的方式,但是,有沒有一個原因我的方式沒有工作(無論是餅乾jar或hte腳本?) – Claudiu 2012-02-13 22:30:23

+0

我複製我的代碼有點過於字面,並留在最後一點。我已經修改和測試過,現在它可以工作。看到上面的更新。 – 2012-02-14 14:41:30

+0

我將如何使用這個'mechanize.Browser()'?我的代碼已經使用瀏覽器,如果可能的話,我寧願不改變它。 – Claudiu 2012-02-14 15:15:47