我正在使用urllib2和HTTPCookieProcessor登录网站。我想同时登录多个帐户并存储cookie以便以后重用。
您能推荐一种方法或库来实现这一目标吗?
答案 0 :(得分:1)
如何实现这一点取决于您的需求:它是什么类型的登录?摘要认证?它是一个网络表单吗?是否涉及JavaScript(如果是这种情况,你几乎搞砸了)?像mechanize这样的库可以帮助你解决很多问题:处理表单,重定向,身份验证,cookie ......但是,你必须通过生成线程/进程来自己处理并发。
另一种适用于并发的方法是使用Twisted。然而,使用该解决方案,您必须自己处理重定向和cookie等 - 尽管您可能能够重用例如机械化。
答案 1 :(得分:1)
OP澄清说这不是并发问题。考虑到顺序处理,这要简单得多。我曾经使用类似下面的东西来更新一堆SIP电话基站(他们有一个网络前端,你可以使用它来上传电话簿的VCard文件)。请注意,我只是删除了一些废话并重命名了这个,在这个hacky脚本中,我做了不测试它。它的唯一目的是让OP知道如何处理这个问题。
#!/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()