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 正则表达式入门(中级篇)
Dec 07 Python
python单例模式实例解析
Aug 28 Python
Python设计模式之原型模式实例详解
Jan 18 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
python操作cfg配置文件方式
Dec 22 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
详解python程序中的多任务
Sep 16 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
详解非极大值抑制算法之Python实现
Jun 28 Python
python实现简单的聊天小程序
Jul 07 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 字符转义 注意事项
2009/05/27 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
jQuery()方法的第二个参数详解
2015/04/29 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
高中自我评价范文
2014/01/27 职场文书
简历的自我评价范文
2014/02/04 职场文书
高三毕业评语
2014/12/31 职场文书
2015国庆节感想
2015/08/04 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers