python爬虫 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

模拟登录

本节课将以登陆知乎为例介绍模拟登录的具体方法和实现。

首先研究知乎的登录页面,确定要提交的表单信息。进入知乎登录页面后可以看到页面需要输入用户名,密码和验证码,输入相关信息后点击提交,使用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相同的目录下,在实验环境下可能无法查看验证码,请在自己机器中运行代码。