POST请求登录网页

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

知乎登录
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)

运行结果:

结果
验证码

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我自己的理解 有可能绕过认证码尽量选择绕过去,请多尝试,绕过去爬取效率高不少; 先不考虑那些一天一套认证码的网站,...
    __混沌阅读 8,289评论 1 1
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,716评论 6 427
  • 经过对django的初步学习,我们已经对后台的基本流程以及django的运作有了一定的了解,但是这还不足够,dja...
    coder_ben阅读 9,238评论 8 34
  • 前言 相信大家利用 Python 写的爬虫应该遇到过要输入验证码的尴尬局面,又或者写了个自动填充表单的小程序,结果...
    迦度蓝洛阅读 16,660评论 2 35
  • 仍要感恩,感谢上帝!(∇*) 这一周,实在是早上睁不开眼中午起不来床的日子…做梦与现...
    4eb414fc6a66阅读 1,332评论 0 0