处理登录表单
- 前言:这个测试网站为了避免不必要的麻烦,并没有通过真实网站进行测试,是博主自己搭建的wordpress平台。请大家不要非法使用到正式网站。
一,处理没有登录验证的网站。
- 1,使用浏览器的检查功能,获取登录表单的属性
-
2,查看表单需要提交的name属性,即为我们要post提交的部分,分别为以下属性
- log:账号
- pwd: 密码
- rememberme:记住登录信息,默认值value为forever
- 隐藏标签,hidden:
- redirect_to :值为 http://localhost/wordpress/wp-admin/
- testcookie :值为1
-
3,找到这些登录信息,即可构造提交表单使用requests进行登录
import requests from bs4 import BeautifulSoup def login_post(url, name, pwd): headers = { 'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive' } post_data = { "log": name, "pwd": pwd, "rememberme": "forever", "redirect_to": r"http://localhost/wordpress/wp-admin/", "testcookie": 1, } # 用session保存登录信息,在网站访问期间。 session = requests.session() login_page = session.post(url, data=post_data, headers=headers) # 输出登录状态 print(login_page.status_code) if __name__ == '__main__': url = "http://localhost/wordpress/wp-login.php?loggedout=true&wp_lang=en_US" login_post(url=url,name="FLanWu", pwd="admin123")
-
4,如果最后输出的状态码为200说明登录成功了。若出现4xx,5xx说明有问题,可查找相对应的状态码进行针对性更改。一般是检查属性值或者是其他hidden是否漏写。
二,对于数字运算验证码的处理
-
1,比如下面的的简单的加法验证码
-
通过检查可以发现,只不过是多了些input表单,只要用bs库解析获得num1,num2表单中的值,然后相加,传给sum表单,然后把num1,num2,sum表单添加到之前的数据中post提交即可进行登录
-
实现代码如下
import requests from bs4 import BeautifulSoup def get_soup(url, encode="utf-8"): # 获取soup对象 header = { 'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive' } resp = requests.get(url=url, headers=header) resp.encoding=encode return BeautifulSoup(resp.text, "lxml") def login_post(url, name, pwd): headers = { 'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive' } soup = get_soup(url=url) # 获取里面的值 num1 = soup.find("input", attrs={"name": "num1"})['value'] num2 = soup.find("input", attrs={"name": "num2"})['value'] sum = int(num1)+int(num2) post_data = { "log": name, "pwd": pwd, "rememberme": "forever", "redirect_to": r"http://localhost/wordpress/wp-admin/", "testcookie": 1, "num1": num1, "num2": num2, "sum": sum, } # 用session保存登录信息,在网站访问期间。 session = requests.session() login_page = session.post(url, data=post_data, headers=headers) print(login_page.status_code) if __name__ == '__main__': url = "http://localhost/wordpress/wp-login.php?loggedout=true&wp_lang=en_US" login_post(url=url,name="FLanWu", pwd="admin123")
-
结果为200成功登录。
-
如果不仅仅是加法还有其他运算都可以使用该方法登录
三,对于简单图片验证码的处理
-
1,碰到简单的验证码如这种:
-
2,通过pillow处理为二值图像:
from PIL import Image img = Image.open(r'img/timg.jpg') # 将彩色图像转换为灰度图像并保存 gray_img = img.convert('L') gray_img.show() gray_img.save("img/captcha_gray_img.jpg") # 设置阈值将图像二值化,一般为白色(0)或者黑色(1),更好处理 value = 200 two_table = [] # 像素的映射表,比如1-200之间的像素映射为255其他映射为0变为黑白图像 for i in range(256): if i < value: two_table.append(255) else: two_table.append(0) # 将映射表和之前的二值图像关联起来,即使用映射的像素,进行一一转换 out_img = gray_img.point(two_table, "1") out_img.show() out_img.save("img/captcha_two.jpg")
-
3,处理后的结果为:
- 灰度图像
- 二值图像
-
注意,如果识别出的图像不清晰,比如这张灰度图像里面的4比较淡,可能处理过后,在二值图像里面不显示,说明阈值取得不当,可以通过调阈值来将其显示出来。
-
4,使用pytesseract库进行图像识别(建议使用anaconda安装,通常pip安装后会报错要另外安装一个光学识别引擎)
import pytesseract from PIL import Image th = Image.open("captcha_two.jpg") str = pytesseract.image_to_string(th) print(str)
-
输出的结果为7364
-
获取了验证码的文本内容,即可通过之前的方法构造post参数,提交即可
-
注意只能处理简单的这种图像验证码,如果出现上面有条纹或者歪歪扭扭的数字,二值处理就会很难,并且如果出现英文和数字混合的情况,通常情况下,会出现将0识别为o或者1识别为I等情况
-
另外像近些年出现的滑动滑块或者是点选图片的验证,这种识别起来很困难,还没研究,后续可能会继续更新
四,说明
- 这个教程只是学习过程,请查阅者不要非法使用,如恶意注册等,后果自负