图片验证和行为验证

图形验证码

在爬虫中图形验证码的解决方式有哪些?
1 可以通过算法 以及深度学习
2 selenium来解决
3 打码平台(付费)
4 tesseract(免费的 开源的 光学文字识别库)

tesseract

1 安装
1.1 需要把安装的路径添加到path环境变量里面 E:\Tesseract-OCR
1.2 需要把训练数据添加到 用户变量
TESSDATA_PREFIX=E:\Tesseract-OCR\tessdata
​
2 安装模块
pip install pytesseract
​
3 使用

打码平台

超级鹰的打码平台 https://www.chaojiying.com/
​
1 注册账号(用户)
2 充值(1块钱或者扫码关注微信公众号 1000题分)
3 创建软件id(点击创建软件id  输入名字 提交)
4 下载实例代码(python  点击下载 压缩文件)
5 使用实例代码
​
​
12306登录的问题

超级鹰识别

import requests
from hashlib import md5
from PIL import Image
from selenium import webdriver
import time
from selenium.webdriver import ActionChains

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.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 PostPic(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 ReportError(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()


# chaojiying = Chaojiying_Client('Jerry1234 ', '123456', '914400')  # 用户中心>>软件ID 生成一个替换 96001
# im = open('code2.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# print(chaojiying.PostPic(im, 9004)['pic_str'])


driver = webdriver.Chrome()
# 加载登录页面
driver.get('https://kyfw.12306.cn/otn/login/init')
time.sleep(5)
# 对加载的页面进行截图并保存
driver.save_screenshot('code.png')
# 定位图片
code_img_element = driver.find_element_by_class_name('touclick-image')
lacation = code_img_element.location # 验证码图片左上角的坐标 lacation 它是个字典
size = code_img_element.size # 验证码图片对应的是长和宽 size 也是个字典
# 左上角和右下角坐标
rangle = (int(lacation['x']),int(lacation['y']),int(lacation['x']+size['width']),int(lacation['y']+size['height']))

i = Image.open('./code.png') # 打开整张截图
code_img_name = './yzm.png'
frame = i.crop(rangle) # crop() 根据指定区域进行裁剪
frame.save(code_img_name)

# 将验证码图片提交给超级鹰进行识别
chaojiying = Chaojiying_Client('Jerry1234 ', '123456', '914400')
im = open('yzm.png', 'rb').read()
print(chaojiying.PostPic(im, 9004)['pic_str'])


result = chaojiying.PostPic(im, 9004)['pic_str']
all_lst = [] # 存储要被点击的点的坐标 [[],[]]
if '|' in result: # 判断竖线是否在返回的结果中 如果有竖线就进行分割
    lst1 = result.split('|')
    count1 = len(lst1)  # 获取长度
    for i in range(count1):
        xy_lst = []
        x = int(lst1[i].split(',')[0])
        y = int(lst1[i].split(',')[1])
        xy_lst.append(x)
        xy_lst.append(y)
        all_lst.append(xy_lst)
else:
    x = int(result.split(',')[0])
    y = int(result.split(',')[1])
    xy_lst = []
    xy_lst.append(x)
    xy_lst.append(y)
    all_lst.append(xy_lst)
print(all_lst)

# 遍历列表使用行为链对每一个列表元素对应的x,y指定的位置进行点击
for l in all_lst:
    x = l[0]
    y = l[1]
    # 将参照物移动到验证码图片 code_img_element(验证码图片的元素)
    ActionChains(driver).move_to_element_with_offset(code_img_element,x,y).click().perform()
    time.sleep(0.5)

12306图片验证码的实现(selenium(鼠标行为链) + 打码平台)

打码平台
1 注册账号
2 充值
3 创建软件id
4 下载实例代码
5 使用实例代码
​
12306图片验证码的实现
​
解决方案: selenium(鼠标行为链) + 打码平台
​
思路:
通过selenium来加载登录页面,获取验证码图片。我就可以把验证码图片交给超级鹰打码平台进行处理。让其给我返回这张验证码正确的坐标值。拿到正确的坐标值之后去点击图片
​
实现步骤
第一步 使用selenium加载登录页面
第二步 对页面进行保存
第三步 截取12306图片验证码
第四步 交给超级鹰打码平台进行识别 返回正确的坐标值
第五步 根据正确的坐标值进行点击
​
​
# 1 定位图片
code_img_element = driver.find_element_by_class_name('imgCode')
# 2 获取图片的左上角坐标值
location = code_img_element.location # location返回值是个字典 左上角坐标值
# 3 获取图片的宽和高
size = code_img_element.size # size也是一个字典 图片的宽和高
# 4 获取左上角和右下角的坐标值
rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
i = Image.open('code.png')
code_img_name = 'yzm.png'
frame = i.crop(rangle) # crop() 根据指定区域进行裁剪
frame.save(code_img_name)
​
opencv
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html

行为验证(selenium(鼠标行为链) + 算法)

解决方案: selenium(鼠标行为链) + 算法
原理:完全模拟人的行为,按住滑块,拖动到目标缺口位置
​
思路:
我们将目标图片和目标缺口的距离分成2部分。前面一部分我们就刷的一下拖过去。后面一部分 我们可以先匀加速然后在匀减速
按住拖动按钮 拖动到目标缺口 松开
​
后面的一段速度代码需要用算法来实现
​
拓展 opencv

Qq空间行为验证码案例

from selenium import  webdriver
import time
from selenium.webdriver import ActionChains
from selenium.common.exceptions import NoSuchElementException,StaleElementReferenceException

def login():
    driver = webdriver.Chrome()
    driver.get('https://i.qq.com/')
    time.sleep(2)
    # 切换iframe
    driver.switch_to.frame(driver.find_element_by_id('login_frame'))
    # 切换登录方式
    driver.find_element_by_id('switcher_plogin').click()
    driver.find_element_by_id('u').send_keys('192149641')
    driver.find_element_by_id('p').send_keys('logic12345')
    time.sleep(1)
    driver.find_element_by_id('login_button').click()
    time.sleep(2)
    # 创建行为链对象
    actions = ActionChains(driver)

    # 切换拖动验证的iframe tcaptcha_iframe
    driver.switch_to.frame(driver.find_element_by_id('tcaptcha_iframe'))
    # x坐标的偏移量
    x = 165
    flag = True
    while flag:
        try:
            # 定位拖动按钮
            tcaptcha_drag_thumb = driver.find_element_by_id('tcaptcha_drag_thumb')
            # 按下拖动
            actions.drag_and_drop_by_offset(tcaptcha_drag_thumb,xoffset=x,yoffset=0).perform()
        except NoSuchElementException:
            driver.quit()
            login()
        time.sleep(2)

        try:
            actions.drag_and_drop_by_offset(tcaptcha_drag_thumb, xoffset=x, yoffset=0).perform()
        except StaleElementReferenceException:
            pass
        x = x + 5 # 每次偏移量+5
        time.sleep(1)
        try:
            driver.find_element_by_id('feed_tab_my')
            break
        except NoSuchElementException:
            print('未登录到主页')

login()

参考文章

https://www.cnblogs.com/xiao-apple36/p/8878960.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值