基本使用
-
爬虫有时需要验证才能登录,此时就需将图片翻译成文字。Tesseract可以将图像翻译成文字,即OCR(Optical CharacterRecognition ) ,光学文字识别,Tesseract是⽬前公认的优的开源OCR库。Tesseract具有很⾼的识别度,也具有很⾼的灵活性,他可以通过训练识别任何字体
-
首先需要下载可执行文件:
https://github.com/tesseract-ocr/ -
基本使用:
import pytesseract
from PIL import Image
# 获取拉勾网的验证码
r = requests.get('https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891').content
# 如果获取的图片为base64 编码的则需要解码
# r = base64.b64decode(r['img'])
# 写入本地
with open('img.jpg', 'wb') as f:
f.write(r)
# 打开图片
image = Image.open('img.jpg')
image.show()
# 初始化tesseract 其中的路径为tesseract安装路径
pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract-OCR\tesseract.exe'
# 设置配置项
config = r'--tessdata-dir "D:\Tesseract-OCR\tessdata"'
# 将图片识别为字符
print(pytesseract.image_to_string(image, lang='eng',config=config))
案例-自如网
import pytesseract
import requests
import re
from bs4 import BeautifulSoup
from PIL import Image
def get_data():
# 先请求网页,获取基本的数据
url = 'http://wh.ziroom.com/z/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'}
r = requests.get(url, headers).text
html = BeautifulSoup(r, features='lxml')
# 查找第一间房子的价格数据
list_box = html.find('div', attrs={'class': 'Z_list-box'})
# 获取所有房子的信息item 这里只获取一个
for item in list_box.find_all('div', attrs={'class': 'item'}):
break
# 获取偏移量和图片的URI
nums = item.find_all('span', attrs={'class': 'num'})
positions = []
for num in nums:
position = num.get('style').split(':')[-1][:-2]
uri = re.search(r'\((.*?)\)', num.get('style').split(':')[1]).group(1)
positions.append(float(position.strip()))
return positions, uri
def parse_data(positions, uri):
# 获取png
r = requests.get('http:' + uri).content
with open('img.png', 'wb') as f:
f.write(r)
# 读取
img = Image.open('img.png')
img.show()
# 初始化
pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract-OCR\tesseract.exe'
# 配置
config = r'--tessdata-dir "D:\Tesseract-OCR\tessdata"'
# 识别
nums = pytesseract.image_to_string(img, lang='eng', config=config).strip()
# 识别的时候会多一些空格,去掉
n = [num for num in nums if num != ' ']
print(n)
# 根据偏移量获取价格的数字
positions = [int(abs(position / 21.4)) for position in positions]
price = ''
for p in positions:
price += n[p]
print(price)
if __name__ == '__main__':
p, u = get_data()
parse_data(p, u)
- 识别效果不错,如下: