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的源码来解析Python下的freeblock
May 11 Python
开始着手第一个Django项目
Jul 15 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
详解python3中zipfile模块用法
Jun 18 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
python list格式数据excel导出方法
Oct 31 Python
python用post访问restful服务接口的方法
Dec 07 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
Python中文编码知识点
Feb 18 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 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文件读写操作之文件写入代码
2011/01/13 PHP
php不用正则验证真假身份证
2013/11/06 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
htm调用JS代码
2007/03/15 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
详解vue使用$http服务端收不到参数
2019/04/19 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
团支书的期末学习总结自我评价
2013/11/01 职场文书
招商业务员岗位职责
2013/12/16 职场文书
环保公益广告语
2014/03/13 职场文书
厨房管理计划书
2014/04/27 职场文书
机关作风建设工作总结
2014/10/23 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python
Python入门学习之类的相关知识总结
2021/05/25 Python
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL