python爬虫之滑动验证码[完整版]



爬虫的一大难点就是破解验证码。验证码大致上分为文字识别、滑动、文字点击、图像识别等,本文讲的是其中的滑动验证码。滑动验证码,需要我们将滑块移至图片缺口位置。


滑动验证码破解大致流程为:

1 - 启动浏览器,并进行截图,分割出验证码部分
2 - 将分割得到的验证码图片,发至超级鹰平台,获取返回的坐标
3 - 使用selenium模拟移动滑块


使用工具:python,selenium,chromedriver,chrome浏览器



操作步骤讲解环节


下面就是喜闻乐见的操作步骤讲解环节了(´◔౪◔)



代码部分:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image

import os
import sys
path = os.path.dirname(os.path.dirname(__file__))
sys.path.append(path)

from chaojiying import Chaojiying_Client
import requests
from hashlib import md5


class main():
    def __init__(self):
        self.url = 'http://www.geetest.com/Register'
        self.file_path = './img/code_picture.png'
        self.file_path2 = './img/code_picture2.png'
        self.distance = 0
        self.key = 0

    # 启动浏览器
    def Launch_browser(self):
        self.driver = webdriver.Chrome()
        self.wait = WebDriverWait(self.driver, 10, 0.5)
        self.driver.get(self.url)

        Phone_Number = self.driver.find_element_by_xpath(
            '/html/body/div[1]/div/div[8]/div/div[2]/div[1]/div[2]/div/div[2]/div[1]/input')
        Verification_Code = self.driver.find_element_by_xpath(
            '/html/body/div[1]/div/div[8]/div/div[2]/div[1]/div[2]/div/div[2]/div[2]/input')
        Code_Button = self.driver.find_element_by_xpath(
            '/html/body/div[1]/div/div[8]/div/div[2]/div[1]/div[2]/div/div[2]/div[2]/div[1]/div')

        Phone_Number.send_keys('12345678910')
        Code_Button.click()

        # 等待className为geetest_slider_button的元素在元素表中出现
        self.slider = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_slider_button')))

    # 截图
    def get_picture(self):
        self.driver.save_screenshot(self.file_path)

    # 分割截图获取验证码图片
    def crop_picture(self):
        image = Image.open(self.file_path)
        weight, height = image.size
        # 这里的比例需要自己摸索,实际上只需要横坐标准确即可
        box = (weight * 1/2 - 130, height * 1/2 - 130, weight * 1/2 + 130, height * 1/2 + 25)
        region = image.crop(box)
        region.save(self.file_path2)

    # 超级鹰
    def cjy(self):
        # 用户中心>>软件ID 生成一个替换 910001
        self.chaojiying = Chaojiying_Client('xxx', 'xxx', 'xxx')
        # chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰密码', '910001')
        # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        im = open('./img/code_picture2.png', 'rb').read()
        # 9101 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
        # 咨询了一下滑动验证码是选择9101
        re = self.chaojiying.PostPic(im, 9101)
        print(re)
        # print(re['pic_str'])

        # 减去一半滑块长度
        self.distance = int(re['pic_str'].split(',')[0]) - 25
        print(self.distance)
        self.im_id = re['pic_id']
        print(self.im_id)

    # 获取轨迹
    def get_track(self):
        # 轨迹
        self.track = []
        # 设置一个分隔线,之前为匀加速运动,之后为匀减速运动
        mid = self.distance * 4 / 5
        # 用于记录当前的移动距离
        current = 0
        # 时间间隔
        t = 0.2
        # 初速度
        v = 0

        while current < self.distance:
            if current < mid:
                a = 8
            else:
                a = -12
            v0 = v
            v = v0 + a * t
            move = v * t + 1 / 2 * a * t * t
            current += move
            self.track.append(round(move))
        print(self.track)

    # 模拟移动
    def move(self):
        # 直接移动到指定坐标
        self.track = [self.distance]
        # 点击和按住
        ActionChains(self.driver).click_and_hold(self.slider).perform()
        # 拖动
        for x in self.track:
            ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()
        time.sleep(2)
        # 松开鼠标
        ActionChains(self.driver).release().perform()

    # 检测结果(目前不做检测,先白嫖一下)
    def check(self):
        if self.key ==1:
            pass
        # 出错时反馈给超级鹰,取消扣分
        else:
            re = self.chaojiying.ReportError(self.im_id)
            print(re)

    # 关闭浏览器
    def quit(self):
        time.sleep(5)
        self.driver.quit()



    # main方法
    def main(self):
        self.Launch_browser()
        self.get_picture()
        self.crop_picture()
        self.cjy()
        # 目前选择直接跳到缺口
        # self.get_track()
        self.move()
        self.check()
        self.quit()

if __name__ == '__main__':
    ma = main()
    ma.main()






要点总结:
1 - 代码分为两个文件main.py和chaojiying.py,chaojiying.py为超级鹰平台的官方文件,下载后直接放在main.py的同一目录即可。
2 - 本篇为前三篇文章的总结,完整的解决了滑动验证码的问题。
3 - 获取坐标的部分交给了超级鹰平台处理。







那么本次的分享就到这里了,喜欢的话麻烦点赞关注一下;不喜欢的话可以去看下小编的其他文章,肯定有喜欢的;都不喜欢的话可以点个关注,万一以后有喜欢的呢(๑•̀ㅂ•́)و✧

有疑问的小伙伴也可以在评论区留言哦,我会第一时间解答的。





你点了吗◔ ‸◔?

推荐阅读更多精彩内容