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