python OCR识别中文

python破解文字点选

今天写脚本的时候遇见了一个点选 必须破解了才能拿到详情页的信息,弄了一上去特此记录一下

反爬虫(点选)

请添加图片描述
需要依次点击文字 然后通过后端认证才能拿到详情页信息

F12分析

请添加图片描述
可以看到 首先发送了一个请求返回了一个JSON 其中有需要点击的文字 和一长串看不懂的东西,这个其实就是图片 但是通过了base64编码

base64.b64decode(data)# data 就是json中的data

一行代码拿到图片的二进制格式

文字识别(paddleocr)

文字识别我选择的是 paddleocr

PaddleOCR是百度开源的一款基于深度学习的ocr识别库,对中文的识别精度相当不错,可以应付绝大多数的文字提取需求。

需要依次安装三个依赖库,安装命令如下

pip install paddlepaddle
pip install shapely
pip install paddleocr

使用方式如下:

ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr(res, cls=False) # res为图片的二进制格式 或者直接传入图片的路径 cls 为true可以识别旋转180°的文字 默认为true 为false可以提升效率
word_result = dict()
for line in result[0]:
    print(line, end='\n\n\n') # line为一个列表 第一个元素是坐标 第二个元素为识别出来的字体

请添加图片描述

原图如下:
请添加图片描述

返回结果

[[[126.0, 2.0], [158.0, 2.0], [158.0, 29.0], [126.0, 29.0]], (‘诞’, 0.9980127811431885)]

返回结果为一个列表 列表的第一个元素是坐标,一共有四个;第二个元素是一个元组 元组第一个元素为识别结果,第二个元素是相似度

重点说一下第一个元素----坐标
为什么返回了四个坐标? 因为paddleocr识别出来的是一个范围 如下图:
请添加图片描述
他返回的是个坐标其实是红框的四个顶点,我们需要自己通过计算得出一个范围。

完整代码

import base64
import requests
from paddleocr import PaddleOCR
import random

def yzm_code(res):
    ocr = PaddleOCR(use_angle_cls=True, lang="ch")
    result = ocr.ocr(res, cls=False)
    word_result = dict()
    for line in result[0]:
        print(line, end='\n\n\n')
        words, _ = line[-1]
        ds = line[0]
        area_x = []
        area_y = []

        if (word_num := len(words)) > 1:
            '''
            处理点
            '''
            for i in range(4):
                d = ds[i]
                d_x = d[0]
                d_y = d[-1]
                area_x.append(d_x)
                area_y.append(d_y)

            d_value_x = (max(area_x) - min(area_x)) / word_num
            d_value_y = (max(area_y) - min(area_y)) / word_num

            for i in range(word_num):
                word = words[i]  # 字
                x = min(area_x) + random.randint(int(d_value_x * i), int(d_value_x * (i + 1)))  # 根据字的顺序 计算出x坐标
                y = min(area_y) + random.randint(int(d_value_y * i), int(d_value_y * (i + 1)))  # 根据字的顺序 计算出y坐标
                word_result[word] = (x, y)
        else:
            '''
            只有一个点的时候
            '''
            for i in range(4):
                d = ds[i]
                d_x = d[0]
                d_y = d[-1]
                area_x.append(d_x)
                area_y.append(d_y)
            x_num = sum(area_x) / len(area_x)
            y_num = sum(area_y) / len(area_y)
            word_result[words] = (x_num, y_num)
    return word_result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值