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实现绘制树枝简单示例
Jul 24 Python
python中readline判断文件读取结束的方法
Nov 08 Python
Python3.x中自定义比较函数
Apr 24 Python
Python3.2中Print函数用法实例详解
May 19 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
python线程池threadpool使用篇
Apr 27 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
Tensorflow卷积神经网络实例
May 24 Python
python实现宿舍管理系统
Nov 22 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 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
咖啡知识大全
2021/03/03 新手入门
PHP 上传文件的方法(类)
2009/07/30 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python 解压pkl文件的方法
2018/10/25 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
python单例模式的多种实现方法
2019/07/26 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
python实现批量命名照片
2020/06/18 Python
python能否java成为主流语言吗
2020/06/22 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
寒假实习自荐信
2014/01/26 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
财务部绩效考核方案
2014/05/04 职场文书
语文教育专业求职信
2014/06/28 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python