点触验证码识别

点触验证码

随着爬虫,反爬技术的升级,优秀的web开发工程师又相处了更变态的验证码。那就是点触验证码!例如最著名的,连人类有时候都识别不出来的,12306网站的验证码。

一、点触验证码的原理

点触验证码的设计原理是给出一张复杂的图片,根据图片上的指示,点击图片特点区域。前端通过js收集点击坐标,后台进行校验,更变态一点的还要求,点击顺序。例如下面这些:

点触验证码识别_第1张图片

点触验证码识别_第2张图片

二、解决思路

图像识别,人工智能,maybe。但是技术难度大,实现周期长,投入成本高。现在市面上出现了提供验证码服务的服务提供商,也出现了提供识别验证码的服务提供商。所以这里我们给大家介绍超级鹰这个网站。

http://www.chaojiying.com/,

具体流程是我们将网页上的验证码图片发送给超级鹰后台,它识别后,返回需要点击的坐标点。我们拿到坐标点后再通过selenium点击图片上的具体位置,从而实现验证功能。

1.超级鹰的接口使用

在今后的开发过程中我们会用到很多的第三方服务,例如短信接口,cdn,对象存储等,要学会查看接口文档以及调试和使用。

打开超级鹰的文档开发,找到python语言,下载demo

点触验证码识别_第3张图片

下载解压之后有一个chaojiying.py的文件,正常情况,你应该可以看懂它的,不会的自觉墙角面壁思过。

首次注册会赠送1000分用来测试。在用户中心生成一个软件id以便在接口中调用。

点触验证码识别_第4张图片

还有一个要注意的是,在调用接口时,需要指定验证码类型,在价格体系中可以查看各种验证码的费用情况以及类型码。

点触验证码识别_第5张图片

准备好这些,我们就可以开始写代码了。

此外点触型验证码的识别还在学习,此只讨论代码的可行性

2.代码编写

以某个网站的的登录界面为例

import requests
import time
import random

from selenium import webdriver
from io import BytesIO

from chaojiying import Chaojiying

CHAOJIYING_USERNAME = '13548612815'
CHAOJIYING_PASSWORD = 'admin123'
CHAOJIYING_SOFT_ID = 899000
CHAOJIYING_TYPE = 9004


class CarHouse:
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)
        self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)

    def login(self):
        self.driver.get('https://account.autohome.com.cn/')

        res = self.check_captcha()
        if res:
            print('验证成功')
        else:
            print('验证失败')

    def check_captcha(self):
        element = self.driver.find_element_by_xpath('//*[@id="embed-captcha"]/div/div[2]/div[1]/div[3]')
        element.click()

        # 滑动验证码
        slider = self.driver.find_elements_by_xpath('//div[@class="geetest_slider_button"]')
        if slider:
            slider = slider[0]
            print('滑动验证码')
            return False


        # 点触验证码
        img = self.driver.find_elements_by_xpath('//img[@class="geetest_item_img"]')

        if img:
            print('点触验证码')
            img = img[0]
            img_content = self.download_img(img.get_attribute('src'))
            data = self.chaojiying.post_pic(img_content, CHAOJIYING_TYPE)

            points = data['pic_str'].split('|')
            # points = ['178,277', '101,155']
            print(points)
            for point in points:
                x, y = point.split(',')
                webdriver.ActionChains(self.driver).move_to_element_with_offset(img, xoffset=int(x), yoffset=int(y)).click().perform()
                time.sleep(random.random() + 1.5)
            self.driver.find_element_by_xpath('//a[@class="geetest_commit"]').click()
            time.sleep(1)

        if self.driver.find_element_by_xpath('//*[@id="embed-captcha"]/div/div[2]/div[2]/div/div[2]/span[1]').text == '验证成功':
            return True
        
    def download_img(self, url):
        print(url)
        response = requests.get(url)
        # img = BytesIO()
        # img.write(response.content)
        return response.content


if __name__ == '__main__':
    carhouse = CarHouse()

你可能感兴趣的:(python-spider)