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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
Python使用pylab库实现画线功能的方法详解
Jun 08 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
深入理解Python异常处理的哲学
Feb 01 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
Python中的list与tuple集合区别解析
Oct 12 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
python实现批量移动文件
Apr 05 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
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
php中cookie的使用方法
2014/03/29 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
PHP的PDO连接讲解
2019/01/24 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
百度地图自定义控件分享
2015/03/04 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python下的subprocess模块的入门指引
2015/04/16 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
python语言元素知识点详解
2019/05/15 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
岗位职责的定义
2013/11/10 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
购房协议书范本
2014/04/11 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
倡议书的格式写法
2015/04/28 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python