使用python模拟登陆豆瓣网时遇到最大的第一个问题就是验证码的识别,这里我采用的是比较原始的方法,即获取验证码图片的url路径将图片下载到本地或者直接通过url打开。遇到的第二个问题是如何保证访问豆瓣登录页面时cookie和验证码图片的同步性,因为每次访问登录页面验证码图片的url路径都是变化的,所以如果不解决同步性的问题,每次登录肯定会失败。下面直接上代码(对于post数据的构造可以使用Firefox浏览器的HttpFox插件去解决,网上有介绍):
# coding: utf8
import urllib
import urllib2
import cookielib
import cStringIO from bs4
import BeautifulSoup from PIL
import Image
# 豆瓣网的登录页面的url loginUrl = 'https://accounts.douban.com/login'
# 点击登录后需要跳转的页面,也就是“我的豆瓣”这个页面(该路径可以在使用HttpFox进行抓包时获取到)
# redirectUrl = 'https://www.douban.com/people/162484790/'
# 实例化cookie对象,每次访问时都会将该cookie中的信息发送到指定domain和path的服务器
# 通过cookie来解决同步性的问题
cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
response1 = opener.open(loginUrl)
soup1 = BeautifulSoup(response1.read(), 'lxml')
''' 需要判断登录时是否需要输入验证码 '''
captchaImgDom = soup1.select_one('#captcha_image')
if captchaImgDom: # 如果有验证码
captchaImgSrc = captchaImgDom['src']
print 'captchaImgSrc =============>>> ' + captchaImgSrc
# 获取captcha-id
prefix = 'https://www.douban.com/misc/captcha?id='
suffix = '&size=s'
captchaId = captchaImgSrc[len(prefix) : len(captchaImgSrc)-len(suffix)]
print 'captchaId =============>>>>> ' + captchaId
# 获取captcha-solution:打开验证码图片并输入验证码
imgFile = cStringIO.StringIO(urllib2.urlopen(captchaImgSrc).read())
img = Image.open(imgFile)
img.show()
captchaSolution = raw_input('请输入验证码:')
# 构造post数据(使用HttpFox插件抓包时获取PostData的相关key)
postData = {
'form_email': '[email protected]',
'form_password': '12345678aa',
'captcha-solution': captchaSolution,
'captcha-id': captchaId,
'redir': redirectUrl
}
else: # 如果没有验证码
postData = {
'form_email': '[email protected]',
'form_password': '12345678aa',
'redir': redirectUrl
}
print 'postData ===========>>>> ' + str(postData)
data = urllib.urlencode(postData)
response2 = opener.open(loginUrl, data)
print '正在登录。。。。。。。。。。。。。'
soup2 = BeautifulSoup(response2.read(), 'lxml')
print soup2.prettify()
if u'登录豆瓣' == soup2.title.string:
print '登录失败'
else:
print '登录成功'