验证码的识别

验证码的识别

验证码和爬虫之间的爱恨情仇?
反爬机制:验证码.识别验证码图片中的数据,用于模拟登陆操作。

识别验证码的操作:

  • 人工肉眼识别。(不推荐)

  • 第三方自动识别(推荐)

  • 可以使用机器学习算法或者gitee上的一些开源项目进行识别,但是效果比较单一。

1.云打码的使用

说明:云打码平台多种多样,不一定局限与某一个。本次使用的云打码平台请点击详情查看;

相关 Python 文档如下图。

平台已经转换好了相关的base64转换等工作,只需将图片的路径传入下面的运行部分即可。

import json
import requests
import base64


class YdmVerify(object):
    _nom_url = "https://www.jfbym.com/api/YmServer/verifyapi"
    _fun_url = "https://www.jfbym.com/api/YmServer/funnelapi"

    _token = "" //填用户中心秘钥
    _headers = {
        'Content-Type': 'application/json'
    }

    def common_verify(self, image_content, verify_type="10101"):
        # 英文数字,中文汉字,纯英文,纯数字,任意特殊字符
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="10101" 单次积分
        print(base64.b64encode(image_content).decode())
        payload = {
            "image": base64.b64encode(image_content).decode(),
            "token": self._token,
            "type": verify_type
        }
        resp = requests.post(self._nom_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']

    def slide_verify(self, slide_image, background_image, verify_type="20101"):
         # 通用滑块
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="20101" 单次积分
        # slide_image 需要识别图片的小图片的base64字符串
        # background_image 需要识别图片的背景图片的base64字符串(背景图需还原)
        payload = {
            "slide_image": base64.b64encode(slide_image).decode(),
            "background_image": base64.b64encode(background_image).decode(),
            "token": self._token,
            "type": verify_type
        }
        resp = requests.post(self._nom_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']

    def click_verify(self, image, extra=None, verify_type=30001):
        # 点选,点选+额外参数
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="30001" 单次积分 点选
        # verify_type="30002" 单次积分 点选+需要按某种语义点选

        # 注意:
        # 例如 :extra="请_点击_与小体积黄色物品有相同形状的大号物体。"
        # 例如 :extra="请点击正向的大写V。"
        # 例如 请依次点击 "鹤" "独" "剩" 这种 转换成:extra="鹤,独,剩"
        # 例如 拖动交换2个图块复原图片 这种 转换成:extra="拖动交换2个图块复原图片"
        # 如有其他未知类型,请联系我们

        payload = {
            "image": base64.b64encode(image).decode(),
            "token": self._token,
            "type": verify_type
        }
        print(base64.b64encode(image).decode())
        if extra:
            payload['extra'] = extra
            payload['type'] = str(int(payload['type'])+1)
        resp = requests.post(self._nom_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']


    def hcaptcha_verify(self, site_key, site_url, verify_type="50001"):
        # Hcaptcha
        # 请保证购买相应服务后请求对应 verify_type
        # verify_type="50001"
        payload = {
            "site_key": site_key,
            "site_url": site_url,
            "token": self._token,
            "type": verify_type
        }
        resp = requests.post(self._fun_url, headers=self._headers, data=json.dumps(payload))
        print(resp.text)
        return resp.json()['data']['data']


if __name__ == '__main__':
    Y = YdmVerify()
    with open("../1.png", 'rb') as f:
        img_content = f.read()
    Y.common_verify(img_content)               

2.古诗文网的验证码识别

# -*- coding: utf-8 -*-

import requests
from lxml import etree
from code_result import YdmVerify


url = "https://so.gushiwen.cn/user/login.aspx"
# UA 伪装
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
# 请求界面
response = requests.get(url=url,headers=headers).text
tree = etree.HTML(response) # 实例化xpath解析对象

# 使用XPath 表达式进行数据解析,获取相关的数据
img_code = "https://so.gushiwen.cn"+tree.xpath('//*[@id="imgCode"]/@src')[0]
# 请求图片保存到本地(二进制)
image_byte = requests.get(url=img_code,headers=headers).content
# 写入文件
with open('code.png','wb') as fp:
    fp.write(image_byte)
# 使用打码平台进行打码
Y = YdmVerify()
with open("code.png", 'rb') as f:
    img_content = f.read()
resp = Y.common_verify(img_content)
print(resp)

image-20220701091244877

其他类型的验证码可以参考平台对应的打码接口。

image-20220701091410914

posted @ 2022-07-01 09:19  紫青宝剑  阅读(1040)  评论(0编辑  收藏  举报