原地址:https://blog.csdn.net/sinat_32404247/article/details/79627101
一、问题的出现
为了做个自动选课的小脚本,废了不少功夫。感觉比自己手动抢麻烦了许多。不过,谁让咱家就喜欢倒腾,所以,在选课期间,花了一天的时间把这个自动抢课脚本搞好了,当然还有许多需要继续完善的地方,就留在后期慢慢修正吧。
在这个过程里,遇到头疼的问题估计就是模仿选课请求和自动登录这两件事。选课暂且不谈,在此我只想将一个在自动登录上让我有些莫名其妙的问题和对他的解决方法给阐述了。但愿有同样问题的有缘人,能够看到这篇文章,让问题迎刃而解。把时间花在更多有趣的事情上,而非百度。
二、问题的阐述
因为学校选课系统验证码字迹清晰,无干扰像素。所以,本人采用的自动识别方式是使用pytesseract(一个基础文字的识别库)、配合由Google维护的Tesseract-OCR软件(需单独进行下载安装,本文中不涉及其安装和调试步骤阐述)进行验证码的识别,准确率接近百分百,至少在本人测试阶段未出现识别错误的情况。识别验证码的代码如下:
import pytesseract
from PIL import Image
image = Image.open('图片位置')
pytesseract.image_to_string(image)
- 1
- 2
- 3
- 4
- 5
由于以前使用的是Anaconda3 32位版本,所以,以上代码并未出现任何警告或错误。但由于学习需要将Anaconda3替换为64位版本后,上述代码在运行时出现警告和错误。具体内容如下:
警告内容:
C:\ProgramData\Anaconda3\lib\site-packages\PIL\Image.py:969: UserWarning: Couldn't allocate palette entry for transparency "for transparency")
- 1
错误内容:
Traceback (most recent call last):
File "D:/IDEAWorkSpace/pyLearning/PyInternet/ocr_test.py", line 6, in <module>
print(pytesseract.image_to_string(image))
File "C:\ProgramData\Anaconda3\lib\site-packages\pytesseract\pytesseract.py", line 195, in image_to_string
return run_and_get_output(image, 'txt', lang, config, nice)
File "C:\ProgramData\Anaconda3\lib\site-packages\pytesseract\pytesseract.py", line 132, in run_and_get_output
temp_name, img_extension = save_image(image)
File "C:\ProgramData\Anaconda3\lib\site-packages\pytesseract\pytesseract.py", line 86, in save_image
image.save(input_file_name, format=img_extension, **image.info)
File "C:\ProgramData\Anaconda3\lib\site-packages\PIL\Image.py", line 1930, in save
save_handler(self, fp, filename)
File "C:\ProgramData\Anaconda3\lib\site-packages\PIL\GifImagePlugin.py", line 468, in _save
_write_single_frame(im, fp, palette)
File "C:\ProgramData\Anaconda3\lib\site-packages\PIL\GifImagePlugin.py", line 383, in _write_single_frame
_write_local_header(fp, im, (0, 0), flags)
File "C:\ProgramData\Anaconda3\lib\site-packages\PIL\GifImagePlugin.py", line 493, in _write_local_header
transparency = int(transparency)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
我:
同样的代码,同样的软件,why?
呵,真是让人摸不着头脑呢。
三、问题解决方式
拿出我的利器,来来来,Google一下。不好意思,那段时间有些问题,所以就上不去了。好,百度一下,也可以。百度果然不负众望,让我成功怼了一下午的时间,也没有把问题解决,哭。而后搁置了两天,Google再次复活。我也成功在实验楼的一个问题解决中,看到了真正帮助到我的答案。首先是警告。
C:\ProgramData\Anaconda3\lib\site-packages\PIL\Image.py:969: UserWarning: Couldn't allocate palette entry for transparency "for transparency")
有这一警告的原因在于,验证码的图片模式为RGBA,是无法分配调色盘给透明通道的。更换为RGB模式则不会出现该问题。
所以我对原先的代码进行修改,变为:
import pytesseract
from PIL import Image
image = Image.open('12.jpg')
#转换图片的模式
image = image.convert('RGB')
pytesseract.image_to_string(image)
修改后,pytesseract识别库便能够正常使用。我推测产生错误的原因便是在分配调色盘是出现了问题,所以,导致后续识别时的各个参数出现关联性问题。
四、总结
问题本身并不复杂,值得我总结的是:
-
处理技术方面的问题,尽量使用Google。无意冒犯百度,但确实在某些方面,Google对我解决问题的支持是高于百度的。
-
不是每个问题都能在我所期待的最短时间得到解决,在处理问题和对问题持有的看法,不应该只停留在“现在、立刻、马上”这一阶段。而是应该做好准备,长期或持续和问题抗衡。棘手的问题确实需要立即解决,但有些不是特别重要同时又令自己毫无头绪的问题,还是应该给自己设置一个解决的期限和寻求解决方案的周期。否则,容易落入问题的陷阱中去,时间浪费,而问题依旧一筹莫展。分配好时间,完成好各项计划,在剩余时间来研究和考虑问题,可能会减少本末倒置的情况发生。
-
倒腾的本质在我看来更多是去熟悉和了解那些未曾涉足过的知识或者领域,最终达到知识的互通和融合。
以上。若本文内容或观点有误,敬请指正。