好了,前面一小节咱们对验证码的机制有了了解,同时又对cookies有了更深的认识,前面也说了,咱们须要先获取cookies获得关于验证码的信息,而后带着这个cookies去post数据,咱们再从新把流程整理一下,html
访问登录界面,使用RE获取验证码的网址
python
获取登录界面的cookies,并保存到一个变量,构造openerapi
使用opener自动携带cookies post数据登录cookie
打开网站的其余网址,验证是否登录成功
post
咱们只须要在前面的代码中稍做修改,把处理cookies的部分放到前面来就好了网站
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" ''' 验证码登录try-2 ''' import urllib import urllib2 import re import cookielib # 获取登录界面的源码并将验证码图片的网址抽取出来 login_url = 'http://id.ifeng.com/allsite/login' headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0',} pattern = re.compile(r'<img src="(.*?)".*?',re.S) request = urllib2.Request(login_url,headers=headers) contents = urllib2.urlopen(request).read() items = re.findall(pattern,contents) for item in items: print item # cookies处理的部分,获取登录界面的cookies并保存 cookieJar = cookielib.CookieJar() handler = urllib2.HTTPCookieProcessor(cookieJar) opener = urllib2.build_opener(handler) # 提示用户输入验证码 captcha = raw_input("请输入验证码:") # 构造post数据 data = { 'u': 'xxxxxxxxxxx@qq.com', 'k': 'xxxxxxxxxxxxxxxx', 'auth': captcha, 'auto': 'on', 'comfrom':'', 'type': '2', } post_data = urllib.urlencode(data) # 将post 信息发送到接受信息的网址 response = opener.open("https://id.ifeng.com/api/sitelogin",post_data) print response.read() # 打开凤凰网的博客界面 response2 = opener.open("http://blog.ifeng.com/16441366.html") print response2.read()
好了,来看看输出ui
......又出错了,好烦恼url
在盯着程序看了很久以后,我忽然意识到一个问题,这也就是咱们程序错误的缘由code
再来回顾一下程序的流程,咱们先打开登录界面而后获取验证码的网址并点击该网址获得验证码输入,这里存在一个很大的问题,咱们第一次读取登录界面的源码时,咱们其实就已经有了一个验证码,咱们获取验证码的地址以后又再一次点击这个网址查看验证码,至关因而刷新了这个验证码,这就意味着,咱们先后一共获得了两个验证码,咱们的cookies是在第一个验证码的时候获取的,而咱们点击看到的是第二个验证码,输入的也是第二个验证码,这样,cookies和验证码是对应不上的htm
那么,咱们应该怎么办呢?
为了保证cookies和验证码信息的一致性,咱们须要跳过前面获取验证码的步骤,咱们不是已经有网址了吗?并且这个网址也是能够不断刷新这个验证码的,那咱们就直接向验证码的网址发送请求,获取cookies,并同时将验证码下载到本地保存,这样,cookies就能跟获取的验证码保持一致了