爬虫之点触验证码的识别
一 简介
直接点击图中符合要求的图。所有的答案都正确,验证才会成功,如果有一个答案错误,验证就会失败。
二 目标
用程序来识别并通过点触验证码的验证。
三 了解点触验证码
12306官网的验证码样式:
四 超级鹰注册账号
https://www.chaojiying.com/user/reg
注册用户:cakin24
验证码类型参考:https://www.chaojiying.com/price.html
五 代码
1 Chaojiying.py
import requests
from hashlib import md5class Chaojiying(object):def __init__(self, username, password, soft_id):self.username = usernameself.password = md5(password.encode('utf-8')).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def post_pic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,headers=self.headers)return r.json()def report_error(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()
2 8_3.py
import time
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from chaojiying import Chaojiying# http://admin.touclick.com/login.html的邮箱
EMAIL = '798103175@qq.com'
# http://admin.touclick.com/login.html的密码
PASSWORD = ''CHAOJIYING_USERNAME = 'cakin24'
CHAOJIYING_PASSWORD = ''
CHAOJIYING_SOFT_ID = 898551
CHAOJIYING_KIND = 9102class CrackTouClick():def __init__(self):self.url = 'http://admin.touclick.com/login.html'self.browser = webdriver.Chrome()self.wait = WebDriverWait(self.browser, 20)self.email = EMAILself.password = PASSWORDself.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)def __del__(self):self.browser.close()def open(self):"""打开网页输入用户名密码:return: None"""self.browser.get(self.url)email = self.wait.until(EC.presence_of_element_located((By.ID, 'email')))password = self.wait.until(EC.presence_of_element_located((By.ID, 'password')))email.send_keys(self.email)password.send_keys(self.password)def get_touclick_button(self):"""获取初始验证按钮:return:"""button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'touclick-hod-wrap')))return buttondef get_touclick_element(self):"""获取验证图片对象:return: 图片对象"""element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'touclick-pub-content')))return elementdef get_position(self):"""获取验证码位置:return: 验证码位置元组"""element = self.get_touclick_element()time.sleep(2)location = element.locationsize = element.sizetop, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']return (top, bottom, left, right)def get_screenshot(self):"""获取网页截图:return: 截图对象"""screenshot = self.browser.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))return screenshotdef get_touclick_image(self, name='captcha.png'):"""获取验证码图片:return: 图片对象"""top, bottom, left, right = self.get_position()print('验证码位置', top, bottom, left, right)screenshot = self.get_screenshot()captcha = screenshot.crop((left, top, right, bottom))captcha.save(name)return captchadef get_points(self, captcha_result):"""解析识别结果:param captcha_result: 识别结果:return: 转化后的结果"""groups = captcha_result.get('pic_str').split('|')locations = [[int(number) for number in group.split(',')] for group in groups]return locationsdef touch_click_words(self, locations):"""点击验证图片:param locations: 点击位置:return: None"""for location in locations:print(location)ActionChains(self.browser).move_to_element_with_offset(self.get_touclick_element(), location[0],location[1]).click().perform()time.sleep(1)def touch_click_verify(self):"""点击验证按钮:return: None"""button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'touclick-pub-submit')))button.click()def login(self):"""登录:return: None"""submit = self.wait.until(EC.element_to_be_clickable((By.ID, '_submit')))submit.click()time.sleep(10)print('登录成功')def crack(self):"""破解入口:return: None"""self.open()# 点击验证按钮button = self.get_touclick_button()button.click()# 获取验证码图片image = self.get_touclick_image()bytes_array = BytesIO()image.save(bytes_array, format='PNG')# 识别验证码result = self.chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)print(result)locations = self.get_points(result)self.touch_click_words(locations)self.touch_click_verify()# 判定是否成功success = self.wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'touclick-hod-note'), '验证成功'))print(success)# 失败后重试if not success:self.crack()else:self.login()if __name__ == '__main__':crack = CrackTouClick()crack.crack()
爬虫之点触验证码的识别相关推荐
- python爬虫点触验证码的识别思路(图片版)
转载于:https://www.cnblogs.com/yunlongaimeng/p/9508793.html
- Python爬虫实战 | (16) 破解简书登录点触验证码
在本篇博客中,我们将使用selenium模拟登录简书网站,破解其登陆时的滑动验证码. 我们需要使用验证码识别服务平台.超级鹰,来帮助我们破解点触验证码.下面的chaojiying.py文件用于调用超级 ...
- Class 18 - 1 图形验证码的识别
一.图形验证码的识别 先将验证码的图片保存到本. 打开开发者工具,找到验证码元素.验证码元素是一张图片,src 属性是 CheckCode.aspx.打开链接 http://my.cnki.net/e ...
- Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】
登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://kyfw.12306.cn/otn/resources/login.html 实现目标:模拟登陆中国铁路12306,攻 ...
- Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】
Python3 爬虫学习笔记第十四章 -- [验证码对抗系列 - 点触验证码] 文章目录 [14.1]关于点触验证码 [14.2]点触验证码攻克思路 [14.3]模拟登录 12306 - 总体思路 [ ...
- Python | 爬虫 | selenium自动化测试 | b站点触验证码登录
其实说出来不怕大家笑话,我在学习爬虫的初始阶段梦想就是实现全自动登录b站并且获取b站里面自己想要获取的数据.如今也终于是实现了这个梦想,很感激csdn各位博主,您们撰写的博客给我带来的很大的帮助,谢谢 ...
- 【验证码的识别】—— 点触式验证码的识别
一.前言 大家好,不知不觉的我来csdn已经又一周年了,在这一年里,我收获了很多东西,我是2022年2月22日入驻CSDN的,一开始只是为了方便浏览文章的,后来,我也有事没事发发文章,创作了100多篇 ...
- Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术
滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成. 这类验证码不常见了,官方介绍地址为:https://promotion.a ...
- 爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)
一.极验验证码(geetest)的三种验证模式 以极验官网登录(https://auth.geetest.com/login/)为例: 在点击 "点击按钮进行验证"按钮后,会出现三 ...
最新文章
- 银行程序代发工资的方法
- 【机器学习入门笔记5:OpenCV像素的基础知识】20190203
- 初使用swagger遇到的问题(1)
- python的pip换源_浅析Python3 pip换源问题
- Mysql中Drop删除用户的名字_mysql5.5 使用drop删除用户
- 因服务器配置不当,热门直播平台 Twitch 的125GB 数据和源代码被泄露
- 去除maven父依赖_如何在Maven中从父项目中排除依赖项?
- JavaScript BOM基础
- 在计算机中打开word2010三种方法,Word2019中打开文档的三种方式
- 古剑奇谭显示服务器维修,《古剑奇谭网络版》角色转服功能说明公告
- web移动开发总结(二)
- 如何查看一个期刊是sci几区以及影响因子 入藏号 ISSN等信息
- Quest、Mission、Task——游戏中的“任务”
- SCUT01在线协作白板技术解决方案
- 海淘 亚马逊 冻结账号 怎么办?
- 镜像翻转_【资讯】装动镜世界版假面骑士时王登场,镜像翻转也算新规?
- 【人工智能项目】缺陷检测分割数据集相关整理分享
- 5月第2周业务风控关注 | 央行:严禁未经授权认可的APP接入征信系统
- C++ setsockopt() 函数
- 国产数据库南大通用新三板上市获批