撸雪碧图
自行打开网址http://glidedsky.com/,然后看
页面的数字都是图片的,在源代码中可以看到每个每个数字的class都是不一样的,Styles中有个加密的图片
这段字符需要用base64解密一下
online = base64.b64decode(font_data)
with open(ttf_name,'wb')as f:
f.write(online)
然后用二进制保存一下,打开图片看看
很明显就是把这张图上的数字放到网页上去显示就行了
我以为要用上图像识别呢,但是用尺子量了一下,发觉应该可以直接读取每个class的background-position-x(背景位置x)来直接判定数字就行,这个偏移的位置是-54就是4,那么其他数字的位置也可以直接算出来,不知道每页的位置是不是相同的,如果相同的话就能成功,如果不同可以就要取区间而不能直接固定死。
dict_s = {'0px':'0','-11px':'1','-21px':'2','-35px':'3','-50px':'4','-63px':'5','-75px':'6','-88px':'7','-98px':'8','-113px':'9'}
手动完成的就是这样
下面开始试抓
提前定义这个dict_s不行,因为我运行后发现,第二页和第一页的-px值就变了,所以试抓也是不成功的,这个dict_s的定义需要换一个方式,应该改成从网页上获取这些background-position-x,如果再从小到大的给它排序,虽然每个数字的位置会有一点点的偏差,倒是这个总体的顺序应该还是不变的。
这种提前预定位置的还是不行,有些页面只有9个数字出现,所以还得切图
先整理一下思路
访问页面,获取每个位置的background-position-x和width,一个是数字的起始位置,另一个是宽度,知道了宽度也就知道了结束位置
下载0-9的那张图片,将按数字的起始位置和结束位置切图,在用图像识别将切的图识别成数字
将每组的数字合并
先处理截图吧
先导入处理图片需要用的模块
from PIL import Image
img_name = '1.png'
im = Image.open(img_name)
box = (0,0,15,15)#设置需要切图的位置坐标
region = im.crop(box)
region.save('2.png','png')
box设置的位置坐标是按(左,上,右,下)切的,上下是不变的,我们需要变动左右的位置,也就是起始和终止位置
我一直以为图片的下边沿是x,左边沿是y,其实是错误的,上边沿才是x
图片裁下来以后就是识别图片了
def real_with_img(start,end):
'''
完成图片的切及识别
:params start:图片的起始位置
:params end:图片宽度
:params max_width:图片的宽度,防止最后一个数字截取时超出了图片的位置
:return number:识别出来的数字
'''
img_name = '1.png'#那张大图,包含0-9的
im = Image.open(img_name)
max_width = im.size[0]
#print(f'开始切割图片,图片起始位置{start},图片终止位置{start+end}:')
if start + end > int(max_width):
print('终止位置大于总长度')
box = (start,0,int(max_width),15)
else:
box = (start,1,start + end,15)#定义截图的位置
region = im.crop(box)#按坐标切割图片
region.save('2.png','png')#保存需要识别的单个数字图片
im1 = cv2.imread('2.png')
im2 = cv2.resize(im1,(500,500))#将图片大小重新调整
cv2.imwrite('2.png',im2)
pytesseract.pytesseract.tesseract_cmd = 'C://Program Files (x86)/Tesseract-OCR/tesseract.exe'#识别工具的目录,不加的话会报错
new_image = Image.open('2.png')
image = Binarization(new_image,127)#二值化处理图片,做成黑白的
text = pytesseract.image_to_string(image,lang='eng',config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789')#识别图片的数字
#image.save(text+'.png','png')#用來训练tesseract的
if len(text) == 1:
return text
else:
#识别出2个字符,尝试处理其中多余的字符,只保留数字部分
print(f'类型为{type(text)}:',text)
text = ''.join(e for e in text if e.isalnum())
return text
测试完一轮之后发现效果出奇的差
图片名就是识别出来的效果,多余的符号、空、字母,我也不知道为啥这么明显的数字会被识别成这些
不过至少切图还是很标准的
后面的就是需要改进这个识别工具了,
识别训练可以参考:https://blog.csdn.net/sinat_28891771/article/details/71440547?locationNum=5&fps=1
反正我是对着做的
不过意外来的总是那么的猝不及防嘛
Char是识别的结果,训练的话就是先把这边手动改过来,然后再继续
我改了,全改了,也保存了,但是再重新打开的时候,这个文件就和没有处理一样的。
然后这个问题一直也过不去,下午又要干活也没时间整了,就这样吧
反正整体的思路就是这个了,就是缺的识别效果,可能这个是最重要的。
后来又考虑了一下,还是用每个class的px去估算可能还是可以的,因为图片的总长度可以