• python爬虫-知乎登录


    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    '''
    Required
    - requests (必须)
    - pillow (可选)
    '''
    
    import requests
    try:
        import cookielib
    except:
        import http.cookiejar as cookielib
    import re
    import time
    import os.path
    try:
        from PIL import Image
    except:
        pass
    #使用验证码识别库
    #import pytesseract
    
    
    # 构造 Request headers
    agent = '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
    >")
        return captcha
    
    
    def 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 False
    
    
    
    def login(secret, account):
        # 通过输入的用户名判断是否是手机号
        if re.match(r"^1d{10}$", account):
            print("手机号登录 
    ")
            post_url = 'https://www.zhihu.com/login/phone_num'
            postdata = {
                '_xsrf': get_xsrf(),
                'password': secret,
                'remember_me': 'true',
                'phone_num': account,
            }
        #可加上邮箱的判断,这里不加了
        else:
            print("邮箱登录 
    ")
            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_input
    except:
        pass
    
    
    if __name__ == '__main__':
        while True:
            if isLogin():
                print('您已经登录')
            else:
                account = input('请输入你的用户名
    >  ')
                secret = input("请输入你的密码
    >  ")
                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处即可

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

  • 相关阅读:
    动态代理有啥用(总结)
    ES6随笔--各数据类型的扩展(4)--数组和对象
    ES6随笔--各数据类型的扩展(2)--数值
    ES6随笔--各数据类型的扩展(1) --字符串和正则
    ES6随笔--声明变量
    CommonJS随记
    DOM练习小记--一个简单的Web页面游戏
    js随笔--关于事件
    js随笔--关于this
    js随笔--循环里的弯弯绕
  • 原文地址:https://www.cnblogs.com/tiannan/p/6281732.html
Copyright © 2020-2023  润新知