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导入txt数据到mysql的方法
Apr 08 Python
讲解Python中for循环下的索引变量的作用域
Apr 15 Python
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python操作mongodb数据库进行模糊查询操作示例
Jun 09 Python
python3的输入方式及多组输入方法
Oct 17 Python
python设置随机种子实例讲解
Sep 12 Python
使用python实现飞机大战游戏
Mar 23 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
Jun 23 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中养成7个面向对象的好习惯
2010/07/17 PHP
浅析php工厂模式
2014/11/25 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
php实现小程序支付完整版
2018/10/09 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
大学生个人自我鉴定
2013/12/03 职场文书
致100米运动员广播稿
2014/02/14 职场文书
企业文化建设实施方案
2014/03/22 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
党课培训心得体会
2014/09/02 职场文书
旗帜观后感
2015/06/08 职场文书
SQL实现LeetCode(196.删除重复邮箱)
2021/08/07 MySQL