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 正则表达式操作指南
May 04 Python
python实现k均值算法示例(k均值聚类算法)
Mar 16 Python
python动态性强类型用法实例
May 09 Python
python开发之for循环操作实例详解
Nov 12 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
Python2和Python3的共存和切换使用
Apr 12 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
基于Django实现日志记录报错信息
Dec 17 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
Python如何实现爬取B站视频
May 20 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之第五天
2006/10/09 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
php取出数组单个值的方法
2018/03/12 PHP
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
Json序列化和反序列化方法解析
2013/12/19 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
原生JS实现留言板
2020/03/26 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
Python 流程控制实例代码
2009/09/25 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
事业单位个人应聘自荐信
2013/09/21 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
2014年技术部工作总结
2014/12/12 职场文书
2015年少先队活动总结
2015/03/25 职场文书
限期整改通知书
2015/04/22 职场文书
高一军训口号
2015/12/25 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android