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': '12345678@qq.com',         
		'form_password': '12345678aa',         
		'captcha-solution': captchaSolution,         
		'captcha-id': captchaId,         
		'redir': redirectUrl     
	} 
else:           # 如果没有验证码     
	postData = {         
		'form_email': '12345678@qq.com',         
		'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 '登录成功'

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值