模拟登录
本节课将以登陆知乎为例介绍模拟登录的具体方法和实现。
首先研究知乎的登录页面,确定要提交的表单信息。进入知乎登录页面后可以看到页面需要输入用户名,密码和验证码,输入相关信息后点击提交,使用chrome查看相关信息可以看到真正提交的数据除了上述三个还有xsrf,该变量可以在查看网页源代码中查到,只需要提取出具体的值即可。
首先看如何获取xsrf变量的值
def search_xsrf():
url= " http://www.zhihu.com " #登录页面地址
r=requests.get(url)#获取页面
if int(r.status_code)!=200:
raise NetworkError(u" requestcaptcha network error")
results=re.compile(r"\<input\stype=\"hidden\"\sname=\"_xsrf\"\svalue=\"(\S+)\"",re.DOTALL).findall(r.text)
#使用正则表达式提取xsrf的值
if len(results)<1:
print(u"can not get XSRF")
return None
return results[0]#返回xsrf的值,供后续使用
然后获取页面验证码,代码如下
def download_captcha():
url= " http://www.zhihu.com/captcha.gif "#验证码地址
r = s.get(url,params={"r":str(int(time.time() * 1000)),"type":"login"})#请求获取验证码,params为参数,在chrome中可以看到
if int(r.status_code)!=200:#http返回状态不为200则报错
raise NetworkError(u"request captcha error")
image_name=u"verify."+r.headers['content-type'].split("/")[1]#获取文件名
open(image_name,"wb").write(r.content)#将验证码保存到本地
print (u"正在调用外部程序渲染验证码....")
captcha_code=raw_input("please enter captcha: ")#输入保存的验证码
return captcha_code#返回验证码,供后续使用
接下来是组织提交的数据
def build_form(account,password):
form={account_type:account,"password":password,"remember_me":'true'}#用户名,密码及是否'记住我'
form['_xsrf']=search_xsrf()#调用获取xsrf的方法获得xsrf
form['captcha']=download_captcha()#调用获得验证码的方法获得验证码
return form
进行数据提交,判断是否登录成功
def upload_form(form):
url= " http://www.zhihu.com/login/email "
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36",
'Host': "www.zhihu.com",
'Origin': "http://www.zhihu.com",
'Referer': "http://www.zhihu.com/",
'X-Requested-With': "XMLHttpRequest",
}#构造请求头
r=s.post(url,data=form,headers=headers)#post提交请求数据
if int(r.status_code)!=200:
raise NetworkError(u"upload form failed")
if r.headers['content-type'].lower() =="application/json":#返回数据判断
result=r.json()#将返回数据转为json格式
if result["r"]==0:
print(u"login success")
return{"result":True}
elif result["r"]==1:
print(u"login failed")
return
以上就是模拟登录知乎的程序,完成代码请查看文件夹中的zhihuLogin.py。验证码图片保存在和zhihuLogin.py相同的目录下,在实验环境下可能无法查看验证码,请在自己机器中运行代码。