import logging
import re
from time import sleep
import requests
from PIL import Image
from fake_useragent import UserAgent
from pytesseract import image_to_stringclass RecognizeCode(object):"""使用tesseract识别图片的验证码"""@staticmethoddef filter_color(img_path):"""对图片颜色进行处理"""img = Image.open(img_path)img = vert('L') # 转化为黑白图片img = img.point(lambda x: 0 if x < 140 else 255) # 二值化处理,小于某个值的为黑色,否则为白色img.save(img_path) # 保存并覆盖原文件def to_text(self, img_path):"""识别图片中的验证码"""self.filter_color(img_path) # 图片颜色过滤code = image_to_string(Image.open(img_path), lang='enm') # 识别验证码并返回字符串if code: # 识别成功返回验证码字符串return code.strip().lower() # 去除换行符并转化成小写class GuShi(object):"""使用账号、密码、验证码登录古诗文网,并验证是否登录成功注意:由于tesseract识别精度有限,验证码错误会导致登录失败,因此需要使用循环进行不断识别验证登录,直到登录成功"""user = '' # 账号password = '' # 密码def __init__(self):self.s = requests.Session() # 实例化session对象,用于保持会话self.headers = {'User-Agent': UserAgent().random} # 随机请求头def get_code(self):"""识别图片中的验证码并返回"""url = '.ashx' # 验证码图片地址while True:# 对图片地址发送网络请求r = (url, headers=self.headers).content# 把图片保存到本地,注意图片格式,png格式进行图片二值化处理有问题with open('code.gif', 'wb') as f:f.write(r)# 使用识别图片验证码的类获取验证码字符串并返回,识别失败会返回Nonecode = RecognizeCode().to_text('code.gif')print('识别的验证码为:', code)# 如果返回的是字符串,终止循环并返回结果;否则继续循环,直到返回字符串结果if code:return code # 字符串中有换行符,去除换行符sleep(1) # 设置休眠时间,降低请求频率def get_viewstate(self):"""获取表单数据中所需要的两个值并返回"""url = '.aspx?from=.aspx'r = (url, headers=self.headers).textviewstate1 = re.findall(r'id="__VIEWSTATE" value="(.*?)" />', r)[0]viewstate2 = re.findall(r'id="__VIEWSTATEGENERATOR" value="(.*?)" />', r)[0]return viewstate1, viewstate2def login(self, viewstate1, viewstate2, code):"""使用post请求进行登录"""url = '.aspx?from=http%3a%2f%2fso.gushiwen%2fuser%2fcollect.aspx'# 构建表单数据data = {'__VIEWSTATE': viewstate1,'__VIEWSTATEGENERATOR': viewstate2,'from': '.aspx','email': self.user, # 用户账号'pwd': self.password, # 密码'code': code, # 验证码'denglu': '登录'}self.s.post(url, data=data, headers=self.headers) # post请求def get_data(self):"""验证登录是否成功,成功并返回True;否则返回False"""url = '.aspx'r = (url, headers=self.headers).textif '我的收藏' in r:print('登录成功')return Truelogging.warning('登录失败')return Falsedef run(self):"""执行方法"""# 1.获取构建表单的两个值viewstate1, viewstate2 = _viewstate()while True:# 2.获取验证码code = _code()# 3.post请求进行登录self.login(viewstate1, viewstate2, code)# 4.验证登录是否成功,成功即退出循环,否则继续循环_data():breakif __name__ == '__main__':GuShi().run()
本文发布于:2024-02-03 01:10:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170689382047659.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |