2019独角兽企业重金招聘Python工程师标准>>>
好了,前面一小节我们对验证码的机制有了了解,同时又对COOKIEs有了更深的认识,前面也说了,我们需要先获取COOKIEs得到关于验证码的信息,然后带着这个COOKIEs去post数据,我们再重新把流程整理一下,
访问登陆界面,使用RE获取验证码的网址
获取登陆界面的COOKIEs,并保存到一个变量,构造opener
使用opener自动携带COOKIEs 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'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()
好了,来看看输出
......又出错了,好烦恼
在盯着程序看了好久之后,我突然意识到一个问题,这也就是我们程序错误的原因
再来回顾一下程序的流程,我们先打开登陆界面然后获取验证码的网址并点击该网址得到验证码输入,这里存在一个很大的问题,我们第一次读取登陆界面的源码时,我们其实就已经有了一个验证码,我们获取验证码的地址之后又再一次点击这个网址查看验证码,相当于是刷新了这个验证码,这就意味着,我们前后一共得到了两个验证码,我们的COOKIEs是在第一个验证码的时候获取的,而我们点击看到的是第二个验证码,输入的也是第二个验证码,这样,COOKIEs和验证码是对应不上的
那么,我们应该怎么办呢?
为了保证COOKIEs和验证码信息的一致性,我们需要跳过前面获取验证码的步骤,我们不是已经有网址了吗?而且这个网址也是可以不断刷新这个验证码的,那我们就直接向验证码的网址发送请求,获取COOKIEs,并同时将验证码下载到本地保存,这样,COOKIEs就能跟获取的验证码保持一致了