我不是這方面的專家,但它看起來像使用urllib2維護會話狀態的標準方法是爲每個會話創建一個自定義開啓器實例。這看起來是這樣的:
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
然後你使用它揭幕戰你有沒有到任何身份驗證,所有的會話狀態將保持首戰對象本身。然後你可以傳遞opener對象作爲並行請求的參數。
以下是一個示例腳本,它並行地登錄到secondlife.com併爲多個用戶提供服務,併爲每個用戶並行提供多個頁面請求。此特定站點的登錄過程非常棘手,因爲它涉及從第一個請求中捕獲CSRF令牌,然後才能夠使用第二個請求登錄。出於這個原因,登錄方法非常混亂。原則應該是相同的,但是,不管是什麼網站,你有興趣。
import eventlet
from eventlet.green import urllib2
import re
login_url = 'https://secure-web28.secondlife.com/my/account/login.php?lang=en&type=second-life-member&nextpage=/my/index.php?lang=en'
pool = eventlet.GreenPool(10)
def fetch_title(opener, url):
match = re.search(r'<title>(.*)</title>', opener.open(url).read())
if match:
return match.group(1)
else:
return "no title"
def login(login_url, fullname, password):
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
login_page = opener.open(login_url).read()
csrf_token = re.search(r'<input type="hidden" name="CSRFToken" value="(.*)"/>', login_page).group(1)
username, lastname = fullname.split()
auth = "CSRFToken=%s&form[type]=second-life-member&form[nextpage]=/my/index.php?lang=en&form[persistent]=Y&form[form_action]=Log%%20In&form[form_lang]=en&form[username]=%s&form[lastname]=%s&form[password]=%s&submit=Submit" % (
csrf_token, username, lastname, password)
logged_in = opener.open(login_url, auth).read()
return opener
def login_and_fetch(login_url, fullname, password, page_urls):
opener = login(login_url, fullname, password)
# note that this deliberately uses the global pool
pile = eventlet.GreenPile(pool)
for url in page_urls:
pile.spawn(fetch_title, opener, url)
return pile
login_urls = [login_url] *2
usernames = [...]
passwords = [...]
page_urls = [['https://secure-web28.secondlife.com/my/account/?lang=en-US',
'https://secure-web28.secondlife.com/my/community/events/index.php?lang=en-US']] * 2
for user_iter in pool.imap(login_and_fetch, login_urls, usernames, passwords, page_urls):
for title in user_iter:
print "got title", title
來源
2010-02-20 03:17:37
rdw
這就是我一直在尋找的東西,一直到棘手的登錄位。萬分感謝。 – kbanman 2010-02-20 19:28:18
歡迎!如果您想與其他Eventlet用戶和開發者聊天,請隨時在freenode上通過IRC頻道#eventlet進行投票。 – rdw 2010-02-21 18:47:32
極有幫助的迴應;感謝這個代碼示例 – Profane 2011-08-23 12:38:09