教程所需环境:
最近在学习scrapy的过程中,偶然看到一些模拟登陆的文章,就想自己实现模拟登录知乎,结果知乎刚好更新新版本,对Form data进行了加密,由于本人对js了解甚少,无法获取到知乎对表单数据的加密方式,转而实现豆瓣登录。
1. python 3.x
2. request、lxml、pillow等库
1、从目标网页中获取表单数据
豆瓣登录页:
登录豆瓣的请求页分析:
Form data就是我么需要构建的表单数据,从当前登录请求中可以看出豆瓣在传输过程中还是明文传输,并未对表单数据进行加密。表单中各个字段的意义:
source:为固定值,一般为index_nav或者None;
redir:表示登录后加载页面的域名地址;
form_email:你的用户名;
form_password:你的密码;
captcha-solution:验证码信息;
captcha-id:验证码id;
login:固定值,”登录”;
其中,验证码相关captcha-id和captcha-solution在登录界面的源码中都可以提取得到。
2、验证码识别部分
在模拟登陆第一次登录时,往往要进行验证码的识别,验证码识别可以实现手动输入,下次登录直接加载cookie也不会需要进行任何验证码的识别,出于个人兴趣,简单的试验了下通过pytesseract库实现验证码的自动识别,不过效果并不如人意。
在进行图片处理之前,对验证码进行简单分析:
- 背景图案颜色与字体颜色差别较大;
- 图片中有较均匀的黑色和白色噪点;
- 只有英文单词,没有数字和符号,且字体有轻微扭曲但无遮盖,字体有白色描边;
可以通过PS软件将图片放大之后进行rgb分析,将图片二值化,如图:
可以看出背景已经被二值化去掉,需要处理图片中的噪点,在调用pytesseract库中高斯滤波、中值滤波及均值滤波等方法后,发现中值滤波在人的视角上效果较好。
源码:
from PIL import Image, ImageFilter
import pytesseract
img = Image.open(