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

来源:互联网 发布:mysql 按月份查询 编辑:程序博客网 时间:2024/05/16 14:37

使用python模拟登陆豆瓣网时遇到最大的第一个问题就是验证码的识别,这里我采用的是比较原始的方法,即获取验证码图片的url路径将图片下载到本地或者直接通过url打开。遇到的第二个问题是如何保证访问豆瓣登录页面时cookie和验证码图片的同步性,因为每次访问登录页面验证码图片的url路径都是变化的,所以如果不解决同步性的问题,每次登录肯定会失败。下面直接上代码(对于post数据的构造可以使用Firefox浏览器的HttpFox插件去解决,网上有介绍):

# coding: utf8
import urllibimport urllib2import cookielibimport cStringIOfrom bs4 import BeautifulSoupfrom PIL import Image
# 豆瓣网的登录页面的urlloginUrl = '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 '登录成功'

原创粉丝点击