美文网首页
POST请求登录网页

POST请求登录网页

作者: 王小鱼鱻 | 来源:发表于2017-10-15 22:57 被阅读2836次

    一、登录知乎
    这里用的是手机端登录的,知乎登录的链接

    知乎登录 post请求

    post请求的参数:
    _xsrf:据说是防跨站请求的;
    password:密码
    email:登录邮箱
    captcha:验证码

    在登录页定位到这些参数,用post在登录时传入这些参数,就可以登录了;
    下面是完整代码:

    import requests, time
    from http import cookiejar
    from PIL import Image
    import re
    
    session = requests.session()
    session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36'
    }
    try:
        # 从本地文件加载cookies
        # ignore_discard的意思是即使cookies将被丢弃也将它保存下来,ignore_expires的意思是如果在该文件中cookies已经存在,则覆盖原文件写入
        session.cookies.load(ignore_discard=True)
    except Exception as e:
        print('exception:', e)
        print('没有cookie信息')
    
    def get_xsrf():
        index_url = 'https://www.zhihu.com/signin?next=/'
        # _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"
        response = session.get(captcha_url, headers=headers)
        captcha_name = 'captcha.gif'
        with open(captcha_name, 'wb') as f:
            f.write(response.content)
        im = Image.open(captcha_name)
        im.show()
        return input('请输入验证码: ')
    
    def get_email():
        return input('请输入邮箱: ')
    
    def get_password():
        return input('请输入密码: ')
    
    
    def login(email, password, _xsrf, captcha):
        data = {
            '_xsrf': _xsrf,
            'password': password,
            'email': email,
            'captcha': captcha
        }
        login_url = 'https://www.zhihu.com/login/email'
        response = session.post(login_url, data=data, headers=headers)
        print('response.json() =', response.json())
        # 保存cookies到本地
        session.cookies.save()
    
    def isLogin():
        # 查看用户个人信息来判断是否已经登录
        url = "https://www.zhihu.com/settings/profile"
        # 这里重定向一定要设置为false, 否则就算没有登录会被重定向到登录的地址去, 然后code就返回200了
        response = session.get(url, headers=headers, allow_redirects=False)
        code = response.status_code
        if code == 200:
            return True
        else:
            return False
    
    
    if __name__ == '__main__':
        if isLogin():
            print('您已经登录')
        else:
            email = get_email()
            password = get_password()
            _xsrf = get_xsrf()
            print('_xsrf =', _xsrf)
            captcha = get_captcha()
            login(email, password, _xsrf, captcha)
    
    

    运行结果:

    登录成功

    这里是用邮箱登录的,验证码需要手动输入;

    二、自动识别验证码
    python识别验证码,需要安装的模块

    Ubuntu版本:
    1、tesseract-ocr安装
    sudo apt-get install tesseract-ocr
    2、pytesseract安装
    sudo pip install pytesseract
    3、Pillow 安装
    sudo pip install pillow

    其他linux版本(如centos):
    1、tesseract-ocr安装 没找到直接命令安装,所以需要手动下载安装包。 https://github.com/tesseract-ocr/tesseract 在上述地址中下载最新的tesseract-ocr的安装包,并解压。 通过以下命令安装:
    (1)cd tesseract-3.04.01
    (2)./autogen.sh
    (3)./configure 注意,如果出现error: leptonica not found,需要下载安装leptonica http://www.leptonica.org/download.html
    (4)make
    (5)make install
    (6)ldconfig
    2、pytesseract安装 sudo pip install pytesseract
    3、Pillow 安装 sudo pip install pillow

    windows版本:
    1、tesseract-ocr安装 下载,并安装。
    注意:如果是64位的用户,在安装的时需要改变安装目录,如下图所示

    安装路径

    2、pytesseract安装 pip install pytesseract
    3、Pillow 安装 pip install pillow

    下面验证一下识别验证码:

    #coding:utf-8
    import pytesseract
    from PIL import Image
    image = Image.open('code.png')
    code = pytesseract.image_to_string(image)
    print(code)
    
    

    可能会遇到的问题:
    问题1、FileNotFoundError: [WinError 2] 系统找不到指定的文件。

    Paste_Image.png

    解决办法:
    1、[推荐]: 将tesseract.exe添加到环境变量PATH中,
    例如: 默认路径为C:\Program Files (x86)\Tesseract-OCR
    注意: 为了使环境变量生效,需要关闭cmd窗口或是关闭pycharm等ide重新启动
    2、 修改pytesseract.py文件,指定tesseract.exe安装路径
    打开文件 pytesseract.py,找到如下代码,将tesseract_cmd的值修改为全路径,在此使用就不会报错了。

    # CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
    # tesseract_cmd = 'tesseract'
    tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'
    

    3、 在实际运行代码中指定

    pytesseract.pytesseract.tesseract_cmd = 'D:\\Tesseract-OCR\\tesseract.exe'
    

    问题2:
    pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \Tesseract-OCR\tessdata/eng.traineddata')

    解决方法:
    1、[推荐]:将tessdata目录的上级目录所在路径(默认为tesseract-ocr安装目录)添加至TESSDATA_PREFIX环境变量中
    例如: C:\Program Files (x86)\Tesseract-OCR
    2、 在.py文件配置中指定tessdata-dir

    tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'
    # tessdata_dir_config = '--tessdata-dir "'C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"'
    pytesseract.image_to_string(image, config=tessdata_dir_config)
    

    小试牛刀:

    #coding:utf-8
    import pytesseract
    from PIL import Image
    image = Image.open('code.png')
    code = pytesseract.image_to_string(image)
    print(code)
    
    

    运行结果:

    结果 验证码

    参考文档

    相关文章

      网友评论

          本文标题:POST请求登录网页

          本文链接:https://www.haomeiwen.com/subject/ionquxtx.html