python爬虫-知乎登录

2017-01-13 11:34:24来源:cnblogs.com作者:记得天南人点击

第七城市
#!/usr/bin/env python3# -*- coding: utf-8 -*-'''Required- requests (必须)- pillow (可选)'''import requeststry:    import cookielibexcept:    import http.cookiejar as cookielibimport reimport timeimport os.pathtry:    from PIL import Imageexcept:    pass#使用验证码识别库#import pytesseract# 构造 Request headersagent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'headers = {    'User-Agent': agent}# 使用登录cookie信息session = requests.session()session.cookies = cookielib.LWPCookieJar(filename='cookies')try:    session.cookies.load(ignore_discard=True)except:    print("Cookie 未能加载")def get_xsrf():    '''_xsrf 是一个动态变化的参数'''    index_url = 'https://www.zhihu.com'    # 获取登录时需要用到的_xsrf    index_page = session.get(index_url, headers=headers)    html = index_page.text    pattern = r'name="_xsrf" value="(.*?)"'    # 这里的_xsrf 返回的是一个list    _xsrf = re.findall(pattern, html)    return _xsrf[0]# 获取验证码def get_captcha():    t = str(int(time.time()*1000))    captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"    r = session.get(captcha_url, headers=headers)    with open('captcha.jpg', 'wb') as f:        f.write(r.content)        f.close()    # 用pillow 的 Image 显示验证码    # 如果没有安装 pillow 到源代码所在的目录去找到验证码然后手动输入    try:        im = Image.open('captcha.jpg')        #使用验证码识别,系统需要安装tesseract-ocr软件        #下载地址:https://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe        #由于验证码识别,测试识别率不高,因此暂时不使用,寻找更好的识别方法再加        #code = pytesseract.image_to_string(im)        #print(code)        im.show()        im.close()        #if len(code)!=4:        #    print('自动识别不出验证码,请手动输入验证码!')        #else:        #    captcha = code        #    return captchac    except:        print(u'请到 %s 目录找到captcha.jpg 手动输入' % os.path.abspath('captcha.jpg'))    captcha = input("please input the captcha/n>")    return captchadef isLogin():    # 通过查看用户个人信息来判断是否已经登录    url = "https://www.zhihu.com/settings/profile"    login_code = session.get(url,allow_redirects=False).status_code    if int(x=login_code) == 200:        return True    else:        return Falsedef login(secret, account):    # 通过输入的用户名判断是否是手机号    if re.match(r"^1/d{10}$", account):        print("手机号登录 /n")        post_url = 'https://www.zhihu.com/login/phone_num'        postdata = {            '_xsrf': get_xsrf(),            'password': secret,            'remember_me': 'true',            'phone_num': account,        }    #可加上邮箱的判断,这里不加了    else:        print("邮箱登录 /n")        post_url = 'https://www.zhihu.com/login/email'        postdata = {            '_xsrf': get_xsrf(),            'password': secret,            'remember_me': 'true',            'email': account,        }    try:        # 不需要验证码直接登录成功        login_page = session.post(post_url, data=postdata, headers=headers)        login_code = login_page.text        print(login_page.status)        print(login_code)    except:        # 需要输入验证码后才能登录成功        postdata["captcha"] = get_captcha()        login_page = session.post(post_url, data=postdata, headers=headers)        login_code = eval(login_page.text)        print(login_code['msg'])        return login_code['r']    session.cookies.save()try:    input = raw_inputexcept:    passif __name__ == '__main__':    while True:        if isLogin():            print('您已经登录')        else:            account = input('请输入你的用户名/n>  ')            secret = input("请输入你的密码/n>  ")            result = login(secret, account)            if result == 0:                #爬取登录成功后的网站内容                conf_url = "https://www.zhihu.com/settings/profile"                text = session.get(conf_url,headers=headers).text                print(text)                break

以上代码在python 2.*中运行时,只需修改代码的print处即可

代码部分参考网友,代码持续更新优化中,如有错误或更优的方法欢迎大家的留言!

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台