나는 이것에 대해 전문가가 아니지만 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
환영합니다! 다른 Eventlet 사용자 및 개발자와 어울리고 싶다면 freenode의 IRC 채널 #eventlet을 사용하십시오. – rdw
대단히 도움이되는 답변입니다. 이 코드 예제에 감사드립니다. – Profane