文章目录
Tesseract安装以及简介
阻碍爬虫的。有时候正是在登录或者请求一些数据时候的图形验证码。能将图片翻译成文字被称为光学文字识别(Optical Character Recognition),简写为OCR。介绍一个图像识别开源库:Tesseract。
Windows系统安装 在以下链接下载可执行文件,https://github.com/tesseract-ocr/
在Python中调用Tesseract需要安装pytesseract:
pip install -i https://pypi.douban.com/simple/ pytesseract
- 设置环境变量
安装完成后,如果想要在命令行中使用Tesseract,那么应该设置环境变量。Mac和Linux在安装的时候就默认已经设置好了。在Windows下把tesseract.exe所在的路径添加到PATH环境变量中。
还有一个环境变量需要设置的是,要把训练的数据文件路径也放到环境变量中。 在环境变量中,添加一个TESSDATA_PREFIX=D:\Tesseract-OCR\tessdata
进入cmd输入下面的命令查看版本,正常运行则安装成功
tesseract --version
- 在命令行中使用tesseract
格式:tesseract 图片路径 文件路径
tesseract demo.png a
在代码中使用tesseract识别图像
import pytesseract
from PIL import Image # python图像处理库
from urllib import request
# 指定tesseract的驱动
pytesseract.pytesseract.tesseract_cmd = r'E:\Tesseract-OCR\tesseract.exe'
# 指定tesseract的训练数据的路径
tessdata_dir_config = r'--tessdata-dir "E:\Tesseract-OCR\tessdata"'
url = 'https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891'
request.urlretrieve(url, 'text.png')
image = Image.open('text.png')
result = pytesseract.image_to_string(image, lang='eng', config=tessdata_dir_config)
print(result)
用pytesseract处理图形验证码
验证码URL:https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891
主线程和子线程的执行关系
主线程会等待子线程结束之后在结束
join() 等待子线程结束之后,主线程继续执行
setDaemon() 守护线程,不会等待子线程结束
import threading
import time
def demo():
# 子线程
print("hello girls")
time.sleep(1)
if __name__ == "__main__":
for i in range(5):
t = threading.Thread(target=demo)
t.start()
- 查看线程数量
import threading
import time
# threading.enumerate()
# name = ['a','b','c']
# for index,i in enumerate(name):
# # print(i,type(i))
# print(index,i)
def demo1():
for i in range(5):
print('demo1--%d' % i)
time.sleep(1)
def demo2():
for i in range(10):
print('demo2--%d' % i)
time.sleep(1)
def main():
t1 = threading.Thread(target=demo1)
t2 = threading.Thread(target=demo2)
t1.start()
t2.start()
while True:
print(threading.enumerate())
if len(threading.enumerate()) <= 1:
break
time.sleep(1)
if __name__ == '__main__':
main()
当调用Thread的时候,不会创建线程。
当调用Thread创建出来的实例对象的start方法的时候,才会创建线程以及开始运行这个线程
线程间的通信(多线程共享全局变量)
在一个函数中,对全局变量进行修改的时候,是否要加global要看是否对全局变量的指向进行了修改,如果修改了指向,那么必须使用global,仅仅是修改了指向的空间中的数据,此时不用必须使用global
线程是共享全局变量。
- 多线程传递参数用args
threading.Thread(target=test, args=(num,))
import threading
import time
num = 0
def demo1(nums):
global num
for i in range(nums):
num += 1
print('demo1-num-%d' % num)
def demo2(nums):
global num
for i in range(nums):
num += 1
print('demo2-num-%d' % num)
def main():
t1 = threading.Thread(target=demo1, args=(1000000,))
t2 = threading.Thread(target=demo2, args=(1000000,))
t1.start()
t2.start()
time.sleep(3)
print('main-num-%d' % num)
if __name__ == '__main__':
main()