本练习涉及:css语法、
IO、pytesseract、pillow和parsel库
目录
练习网址:http://www.porters.vip/confusion/recruit.html
如图:
第一步
使用parsel库的css选择器,获取图片的网址
parsel是一个强大的数据解析库
里面有css,xpath以及re
第二步
请求、处理图片,识别成文字
需要用到pillow(原PIL库)和pytesseract库
安装方式: pip install pytesseract,pillow
注意!!!
安装是pillow,调用是import PIL
找不到tesseract语言包的下面拿:
链接: https://pan.baidu.com/s/1B00tHLndwil7-gGWonKXhQ?pwd=ydii 提取码: ydii
用IO库的BytesIO方法读取图片二进制数据
配合PIL.Image方法打开图片
这样操作可以不用将图片保存本地,直接在内存中处理
最后使用pytesseract.image_to_string方法进行文字识别
输出结果
第一部分的源代码
from pytesseract.pytesseract import image_to_string
import requests
from parsel import Selector
from pytesseract import image_to_string
from PIL import Image
import io
url = "http://www.porters.vip/confusion/recruit.html"
res = requests.get(url)
sel = Selector(res.text)
img_ele = sel.css('img.pn::attr("src")').extract_first()
print(img_ele)
# 获取完整的网址
img_url = url.split("recruit.html")[0] + img_ele
# 获取图片的二进制数据
img_res = requests.get(img_url).content
# 使用IO库的BytesIO方法和PIL库的Image.open方法
# 直接在内存里处理图片数据
img_body = Image.open(io.BytesIO(img_res))
# 使用pytesseract的image_to_string
# 实现图片转文字
print(image_to_string(img_body).strip())
第二部分 图片验证码
中国知网:http://my.cnki.net/Register/
如图,先提取验证码的网址,请求网址,
刷新几次发现,每次请求的验证码都不同
通过PIL处理图片,先把图片黑白色处理(消除彩色),再进行二值化处理(消除干扰线)
效果
补充一个计算型验证码:http://www.porters.vip/captcha/mathes.html
多一步,正则re提取
效果
第二部分源代码
from PIL import Image
from io import BytesIO
import pytesseract,requests
from parsel import Selector
base_url = "http://my.cnki.net/Register/"
base_res = requests.get(base_url)
src = Selector(base_res.text).css('#checkcode::attr("src")').extract_first()
img_url = base_url + src
img_res = requests.get(img_url)
# 把图片黑白处理
image = Image.open(BytesIO(img_res.content)).convert('L')
# 二值化处理,去掉背景干扰
threshold = 156
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table,'1')
# 显示图片
image.show()
# OCR识别
print(pytesseract.image_to_string(image))
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By
from io import BytesIO
import pytesseract,re
import time
driver = webdriver.Chrome()
driver.get("http://www.porters.vip/captcha/mathes.html")
# 应对可能出现的网络延迟
time.sleep(1.5)
# 定位元素并截图
# img = driver.find_element(By.XPATH,'//*[@id="matchesCanvas"]').screenshot_as_png
img = driver.find_element(By.CSS_SELECTOR,"#matchesCanvas").screenshot_as_png
# 在内存里打开图片
# 此处图片处理一下,效果会更好
verify_img = Image.open(BytesIO(img))
# 图片提取文字
code = pytesseract.image_to_string(verify_img)
print(code)
# 提取所需要的数据
compi = re.search('(\d+.*?\d+)',code)
# 输入并登陆,xpath和css语法
# input_code = driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(eval(compi.group(1)))
# login = driver.find_element(By.XPATH,'//div[@class="col-sm-4"]/button').click()
input_code = driver.find_element(By.CSS_SELECTOR,'#code').send_keys(eval(compi.group(1)))
login = driver.find_element(By.CSS_SELECTOR,'button.btn').click()
time.sleep(3)
driver.close()
太长了,本文章进阶的下半部分
tesseract是开源免费的库,识别率有限,
不过支持图片训练
百度和腾讯的OCR识别接口效果很好
点个赞呗<( ̄︶ ̄)>