雪碧图1

撸雪碧图
自行打开网址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去估算可能还是可以的,因为图片的总长度可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值