python模拟登陆豆瓣网和验证码识别

使用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 '登录成功'

 

你可能感兴趣的:(python)