ОП пояснил, что это не проблема параллелизма. С учетом последовательной обработки это намного проще. Однажды я использовал что-то вроде следующего для обновления нескольких базовых станций SIP-телефонов (у них был веб-интерфейс, который можно было использовать для загрузки файлов VCard для телефонной книги). Обратите внимание, что я просто удалил немного дерьма и переименовал его, и в этом хакерском скрипте я не проверил его вообще. Его единственная цель - дать ОП понять, как он мог с этим справиться.
#!/usr/bin/python
# -*- coding:utf-8 -*-
from optparse import OptionParser
import sys
from mechanize import Browser, CookieJar, Request, urlopen
accounts = [
{'ipaddr': '127.0.0.1', 'user': 'joe', 'pass': 'foobar'},
]
class WebsiteAccount(object):
def __init__(self, ipaddr, username, password, browser):
self.ipaddr = ipaddr
self.username = username
self.password = password
self.browser = browser
self.cookiejar = CookieJar()
self.browser.set_cookiejar(self.cookiejar)
def login(self):
self.browser.open('http://'+self.ipaddr+'/login.html')
self.browser.select_form(name='loginform')
self.browser.form.set_value(self.username, name='username')
self.browser.form.set_value(self.password, name='password')
resp = self.browser.submit()
print 'Logging into account %s@%s ...' % (self.username, self.ipaddr),
if resp.geturl().endswith('/login.html'):
print 'FAILED!'
sys.exit(1)
print ' OK'
def logout(self):
print ('Logging out from account %s@%s...' % (self.username, self.ipaddr),
self.browser.open('http://'+self.ipaddr+'/logout.html')
self.browser.close()
print 'OK'
def main():
parser = OptionParser()
parser.add_option('-d', '--debug', action='store_true', dest='debug', default=False)
parser.add_option('-v', '--verbose', action='store_true', dest='verbose', default=False)
(opts, args) = parser.parse_args()
for account in accounts:
browser = Browser()
browser.set_handle_referer(True)
browser.set_handle_redirect(True)
browser.set_handle_robots(False)
bs = WebsiteAccount(account['ipaddr'],
account['user'],
account['pass'],
browser)
# DEBUG
if opts.debug == True:
browser.set_debug_redirects(True)
browser.set_debug_responses(True)
browser.set_debug_http(True)
bs.login()
try:
# ... do some stuff
# save cookies here?
pass
finally:
# you shouldn't use this if you are interested in the login cookies
bs.logout()
if __name__=='__main__':
main()