最新消息:

python模拟登陆登陆一:验证码与cookies的同步处理思路

Python 大步 20563浏览 0评论

 自动登陆可能是写爬虫的第一步,如果都不能登陆,很多东西爬不到的。这也不是第一次写包含验证码识别的自动登陆脚本了。这次有点被坑住了,把这次的记录下来。

这次要自动登陆的网站地址是:2013年株洲市中小学教师全员培训   http://zhuzhou2013.feixuelixm.teacher.com.cn/IndexPage/Index.aspx

先说下思路,好多人写那些不需要验证码识别的自动登陆脚本很容易,只要保存好cookies就可以了,但是对于需要验证码的网站就总是登陆不上去。

对于需要验证码的网站的自动登陆脚本的步骤:(以上面我说的那个网站为例,对于python和其他语言,思路和步骤都是适用的)

a.先打开登陆页面,获得cookies。

b.再访问验证码的地址。验证码是动态的,每次打开都不一样。

c.识别验证码。这里就需要你处理、识别刚才得到的验证码。自己去找验证码(captcha)识别库,python可以用 pytesser(这个库是调用PIL来处理识别的) 、openc 之类的   或者可以人工识别然后手动输入验证码。

d.构造post请求数据(request data)和请求头部(request head)  ,然后 将构造的请求 post给网站

f.获取 响应(response)信息,并通过测试来验证登陆是否成功。

或者直接跳过a步骤:

b.直接访问验证码的地址。(这里之所以能跳过 a  ,是因为当我们打开 验证码地址时候,已经能获得所有我们需要的cookies 和登陆的验证码 ,所以就没必要 先操作 a 步骤)

c.识别验证码。这里就需要你处理、识别刚才得到的验证码。自己去找验证码(captcha)识别库,python可以用 pytesser(这个库是调用PIL来处理识别的) 、openc 之类的   或者可以人工识别然后手动输入验证码。

d.构造post请求数据(request data)和请求头部(request head)  ,然后 将构造的请求 post给网站

f.获取 响应(response)信息,并通过测试来验证登陆是否成功。

#############################################################################

这两个步骤的区别无非是多了个访问登陆页面的步骤,对登陆没什么影响。我这里用浏览器演示下 第一种步骤(即a ,b,c,d,e,f步骤),下篇文章开始更具体的操作,获取修改cookies,post数据构造等。

通过下面的步骤来验证我们的思路(还是刚才的网站):

用到的工具:

firefox浏览器中的firebug扩展 。还可以使用Fiddler,或者httpfox,wireshark 。我这用firebug方便。chrome也有firebug。

1.访问登陆页面获取cookies (相当于a 步骤)

先清空火狐的缓存和cookies  ,打开firebug,监控所有网页。然后打开登陆页面:http://zhuzhou2013.feixuelixm.teacher.com.cn/IndexPage/Index.aspx 。我们得到了第一个验证码:2073 可以通过firebug看到所获得的cookies ,如下图

login1

 

 


2.访问验证码地址获得cookies与验证码(相当于 b ,c  步骤)

先找到验证码地址。鼠标右键点击验证码,选择“复制图像地址”,得到验证码地址为:http://zhuzhou2013.feixuelixm.teacher.com.cn/GuoPeiAdmin/Login/ImageLog.aspx ,如下图:

captcha


测试下这个验证码地址是否有效:在不关闭刚才登陆页面的 同时用火狐打开验证码的地址,的确得到了一个验证码,也是我们获得的第二个验证码:2876 ,cookies 还是原来的cookies。如下图:

 captcha2

3. 登陆网站(相当于 d ,f  步骤)

接着,我们开始在刚才打开的登陆网页登陆,输入账号和密码,那么我问你,现在输入哪个验证码才是正确的?你肯定会回答是 2073 这个。错了,这时,我们应该输入第二个获得的验证码:2876   才能正常的登陆进去。不信的话,你可以自己多试几次来验证。

 

如果我们把 刚才 1——2——3 的操作顺序改为:2——1——3

先打开验证码页面获得一个验证码:AAAA,然后打开登陆页面又得到一个验证码:BBBB,此时再登陆,输入第一个 AAAA 验证码登陆, 就是错误的,无法登陆成功。

 

 

至于第二种步骤,我实在找不到能够模拟这个过程的,例如,用fiddler 要先访问验证码地址,获取cookies ,接着用fiddler来模拟post来登陆网站。可惜,我用了n多post软件,都没法实现这些步骤,总是登陆失败。所以直接用python来模拟这个过程:

其中需要 pytesser 模块及其调用的模块和软件都要自己安装,自己去网上google教程安装吧。哥很久很久之前就装了。

pytesser下载

http://code.google.com/p/pytesser/

Tesseract OCR engine下载:

http://code.google.com/p/tesseract-ocr/

PIL官方下载

http://www.pythonware.com/products/pil/

 

python模拟登陆代码:   (点击下载)

 

 python处理cookies与验证码同步,附带验证码访问网页,而urlopen()不能处理cookies,所以它需要安装一个opener容器来处理cookies这些,见下面的关键代码(可以直接用这open()来访问登陆,这里就不细说了)

 

cookiejar = cookielib.MozillaCookieJar()

cookieSupport= urllib2.HTTPCookieProcessor(cookiejar)

httpHandler = urllib2.HTTPHandler(debuglevel=1)

httpsHandler = urllib2.HTTPSHandler(debuglevel=1)

opener = urllib2.build_opener(cookieSupport, httpsHandler)

urllib2.install_opener(opener)

 

 

总结:在需要输入验证码的网页写自动登陆登陆脚本时候。关键是保证cookies 和 验证码 是同步的。如果直接打开验证码地址就能获得 登陆所需的全部cookies (此时验证码和cookies必定是同步到的),那么就不必 打开登陆页面获取cookies打开验证码地址获取 验证码。何必多此一举呢?

 

下面几篇文章就继续说下如何获取和构造post request 之类的。

《python模拟登陆登陆二:获取和处理发送post request和head数据》

转载请注明:大步's Blog » python模拟登陆登陆一:验证码与cookies的同步处理思路

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (10)

  1. 前來支持一下~完全不會Python
    超級efly3年前 (2014-08-11)Reply
    • python比较容易入手,操作也容易些
      大步3年前 (2014-08-12)Reply
  2. 是的。你写代码,先全部写全,然后删除部分不必要的。应为只有验证过后,或者是有经验了,才能知道哪些是多余的。
    大步2年前 (2014-11-24)Reply
    • head具体有什么用呢?你好,我想用php模拟登录学校的教务处网站(http://jwxt.wust.edu.cn/whkjdx/Logon.do?method=logon)这是我的代码:http://paste.ubuntu.com/9196959/ ,老是登不进去,希望能给我些指导。谢谢。
      Accagain_2年前 (2014-11-24)Reply
      • 我们发送post请求,而post请求包含数据段data和请求头header。你自己要用浏览器模拟登录,用firebug之类的抓去登录的post的信息,抓取的方法可以见我的第二篇文章,不知道你看了没。http://www.dabu.info/?p=5638 。header包含了比如,登录成功后,让服务器返回哪个页面,host地址等。
        大步2年前 (2014-11-26)Reply
  3. 对于比较复杂的注册码有啥好方法没?好像pytesser只能识别最简单的。
    loeatore2年前 (2015-03-20)Reply
    • 高级的只能去自己不断匹配和学习优化,需要对特定的验证码不断测试的。
      大步2年前 (2015-03-20)Reply
  4. 一直失败=-=不知道错哪了
    lodog12年前 (2015-07-18)Reply
    • 自己打印log,调试代码吧
      大步2年前 (2015-07-18)Reply
  5. 写得很仔细,条条有理,赞!
    高山1年前 (2015-12-22)Reply
SiteMap