python实现带验证码网站的自动登陆实现代码


Posted in Python onJanuary 12, 2015

早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番,效果还不错。

本例所登录的某网站需要提供用户名,密码和验证码,在此使用了python的urllib2直接登录网站并处理网站的Cookie。

Cookie的工作原理:
Cookie由服务端生成,然后发送给浏览器,浏览器会将Cookie保存在某个目录下的文本文件中。在下次请求同一网站时,会发送该Cookie给服务器,这样服务器就知道该用户是否合法以及是否需要重新登录。

Python提供了基本的cookielib库,在首次访问某页面时,cookie便会自动保存下来,之后访问其它页面便都会带有正常登录的Cookie了。

原理:

(1)激活cookie功能
(2)反“反盗链”,伪装成浏览器访问
(3)访问验证码链接,并将验证码图片下载到本地
(4)验证码的识别方案网上较多,python也有自己的图像处理库,此例调用了火车头采集器的OCR识别接口。
(5)表单的处理,可用fiddler等抓包工具获取需要提交的参数
(6)生成需要提交的数据,生成http请求并发送
(7)根据返回的js页面判断是否登陆成功
(8)登陆成功后下载其它页面

此例中使用多个账号轮询登陆,每个账号下载3个页面。

下载网址因为某些问题,就不透露了。

以下是部分代码:

#!usr/bin/env python
#-*- coding: utf-8 -*-

import os
import urllib2
import urllib
import cookielib
import xml.etree.ElementTree as ET


#-----------------------------------------------------------------------------
# Login in www.***.com.cn
def ChinaBiddingLogin(url, username, password):
    # Enable cookie support for urllib2
    cookiejar=cookielib.CookieJar()
    urlopener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
    urllib2.install_opener(urlopener)
    
    urlopener.addheaders.append(('Referer', 'http://www.chinabidding.com.cn/zbw/login/login.jsp'))
    urlopener.addheaders.append(('Accept-Language', 'zh-CN'))
    urlopener.addheaders.append(('Host', 'www.chinabidding.com.cn'))
    urlopener.addheaders.append(('User-Agent', 'Mozilla/5.0 (compatible; MISE 9.0; Windows NT 6.1); Trident/5.0'))
    urlopener.addheaders.append(('Connection', 'Keep-Alive'))


    print 'XXX Login......'


    imgurl=r'http://www.*****.com.cn/zbw/login/image.jsp'
    DownloadFile(imgurl, urlopener)
    authcode=raw_input('Please enter the authcode:')
    #authcode=VerifyingCodeRecognization(r"http://192.168.0.106/images/code.jpg")


    # Send login/password to the site and get the session cookie
    values={'login_id':username, 'opl':'op_login', 'login_passwd':password, 'login_check':authcode}
    urlcontent=urlopener.open(urllib2.Request(url, urllib.urlencode(values)))
    page=urlcontent.read(500000)


    # Make sure we are logged in, check the returned page content
    if page.find('login.jsp')!=-1:
        print 'Login failed with username=%s, password=%s and authcode=%s' \
                % (username, password, authcode)
        return False
    else:
        print 'Login succeeded!'
        return True


#-----------------------------------------------------------------------------
# Download from fileUrl then save to fileToSave
# Note: the fileUrl must be a valid file
def DownloadFile(fileUrl, urlopener):
    isDownOk=False


    try:
        if fileUrl:
            outfile=open(r'/var/www/images/code.jpg', 'w')
            outfile.write(urlopener.open(urllib2.Request(fileUrl)).read())
            outfile.close()


            isDownOK=True
        else:
            print 'ERROR: fileUrl is NULL!'
    except:
        isDownOK=False


    return isDownOK


#------------------------------------------------------------------------------
# Verifying code recoginization
def VerifyingCodeRecognization(imgurl):
    url=r'http://192.168.0.119:800/api?'
    user='admin'
    pwd='admin'
    model='ocr'
    ocrfile='cbi'


    values={'user':user, 'pwd':pwd, 'model':model, 'ocrfile':ocrfile, 'imgurl':imgurl}
    data=urllib.urlencode(values)


    try:
        url+=data
        urlcontent=urllib2.urlopen(url)
    except IOError:
        print '***ERROR: invalid URL (%s)' % url


    page=urlcontent.read(500000)


    # Parse the xml data and get the verifying code
    root=ET.fromstring(page)
    node_find=root.find('AddField')
    authcode=node_find.attrib['data']


    return authcode


#------------------------------------------------------------------------------
# Read users from configure file
def ReadUsersFromFile(filename):
    users={}
    for eachLine in open(filename, 'r'):
        info=[w for w in eachLine.strip().split()]
        if len(info)==2:
            users[info[0]]=info[1]


    return users


#------------------------------------------------------------------------------
def main():
    login_page=r'http://www.***.com.cnlogin/login.jsp'
    download_page=r'http://www.***.com.cn***/***?record_id='


    start_id=8593330
    end_id=8595000


    now_id=start_id
    Users=ReadUsersFromFile('users.conf')
    while True:
        for key in Users:
            if ChinaBiddingLogin(login_page, key, Users[key]):
                for i in range(3):
                    pageUrl=download_page+'%d' % now_id
                    urlcontent=urllib2.urlopen(pageUrl)


                    filepath='./download/%s.html' % now_id
                    f=open(filepath, 'w')
                    f.write(urlcontent.read(500000))
                    f.close()


                    now_id+=1
            else:
                continue
#------------------------------------------------------------------------------


if __name__=='__main__':
    main()
Python 相关文章推荐
简单解决Python文件中文编码问题
Nov 22 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python实现windows下文件备份脚本
May 27 Python
Django框架验证码用法实例分析
May 10 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 Python
tensorflow 重置/清除计算图的实现
Jan 19 Python
Python requests接口测试实现代码
Sep 08 Python
python中的装饰器该如何使用
Jun 18 Python
Python三元运算实现方法
Jan 12 #Python
Python中的True,False条件判断实例分析
Jan 12 #Python
Python基类函数的重载与调用实例分析
Jan 12 #Python
Python类的专用方法实例分析
Jan 09 #Python
Python序列之list和tuple常用方法以及注意事项
Jan 09 #Python
Python中的生成器和yield详细介绍
Jan 09 #Python
Python中实现对list做减法操作介绍
Jan 09 #Python
You might like
php文件上传 你真的掌握了吗
2016/11/28 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
Python中的Matplotlib模块入门教程
2015/04/15 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python正则简单实例分析
2017/03/21 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
Python检测数据类型的方法总结
2019/05/20 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
python3图片文件批量重命名处理
2019/10/31 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
python如何写个俄罗斯方块
2020/11/06 Python
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
工程专业毕业生自荐信范文
2013/12/25 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
个人近期表现材料
2014/02/11 职场文书
倡议书格式模板
2014/05/13 职场文书
学校运动会报道稿
2014/09/23 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2016春节慰问信范文
2015/03/25 职场文书
员工年度工作总结2015
2015/05/18 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript