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 - 获取坐标的部分交给了超级鹰平台处理。







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

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





你点了吗◔ ‸◔?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容