验证码

# coding:utf-8
# PIL的ImageDraw 提供了一系列绘图方法,让我们可以直接绘图。比如要生成字母验证码图片
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random

#随机字母
def rndChar():
    return chr(random.randint(65,90))

#随机颜色1:
def rndColor():
    return (random.randint(64,255), random.randint(64,255), random.randint(64,255))

#随机颜色2:
def rndColor2():
    return (random.randint(32,127), random.randint(32,127), random.randint(32, 127))

# 240 * 60
width = 60 * 4
height = 60

image = Image.new("RGB", (width, height),(255,255,255))

#创建Font对象
font = ImageFont.truetype("D://Arial.ttf",36)

#创建Draw对象
draw = ImageDraw.Draw(image)

#填充每个像素:
for x in range(width):
    for y in range(height):
        draw.point((x, y), fill = rndColor())

#输出文字
for t in range(4):
    draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())

#模糊
image = image.filter(ImageFilter.BLUR)
image.save('/Users/chenyong/PycharmProjects/untitled/1.jpg', "jpeg")
生成验证码
#破码之拖动滑块
# encoding:utf-8
import selenium
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
# 设定等待时间
wait = WebDriverWait(driver, 30)
# 打开网页
driver.get("http://……")

#等待搜索框加载完成传入搜索关键字
input = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="searchText"]')))
input.send_keys(u"安徽投资有限责任公司")
time.sleep(5)
#等待搜索按钮可点击,点击
button = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="click"]')))
button.click()
time.sleep(5)
actions = ActionChains(driver)
# 进入搜索页后,找到滑块
element = driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']")

#鼠标点击元素并按住不放
actions.click_and_hold(on_element = element).perform()

#拖动鼠标到指定的位置,注意这里位置是相对于元素左上角的相对值
actions.move_to_element_with_offset(to_element = element, xoffset=200, yoffset = 50).perform()
# actions.move_to_element(to_element = element).perform()

#释放鼠标
actions.release(on_element = element).perform()
time.sleep(3)
滑动验证
# coding=utf-8
#非黑即白--谷歌OCR光学字符识别

# 颜色的世界里,非黑即白。computer表示深信不疑。
# 今天研究一下OCR光学识别庞大领域中的众多分支里的一个开源项目的一个包-tesseract。
#
# 能让机器识别图片是无数工程师梦寐以求的事
# 任何物体只有成功转为二进制才有可能被机器识别,而识别是做出一系列智能行为的前提
#
# 下面以一张验证码为例梳理一下机器识别的思路:
#
# 准备工作:
# 1、取到图片地址,在线转化为图片流或者下载到本地
# 2、PIL, pytesseract 两个包,其实主要用他们中各一个函数,前者是用Image将图片做像素级处理,以便后者用image_to_string将图片转化为字符串
# 3、图像基础知识:RGB所代表的红绿蓝色域均为0-255,三色叠加0代表黑色,255代表白色,区间值即为灰度
#
# 流程:
# 1、读取图片转为Image函数的对象
# 2、转化为灰度图(即黑白图片),进行二值化(强化黑白)
# 3、坐标系去除噪点,继续强化黑白
# 4、转化为字符串(涉及到分割、识别,image_to_string自动做了)

from PIL import Image
from pytesseract import image_to_string

#  接收图片地址,和int类型的灰度值作为阈值,返回黑白图
def parse(img_address, g):
    img = Image.open(img_address)
    # 转化为灰度图
    imgL = img.convert('L')
    # imgL.show()
    img_load = imgL.load()
    print(imgL.size)
    # 遍历宽与高中的每一个像素并依据阈值判断,进行二值化
    for y in range(imgL.size[1]):
        for x in range(imgL.size[0]):
            # 阈值就是寻找灰度的平衡点
            # 小于阈值的数就是向黑色靠拢,直接赋值为黑,大于阈值即向255靠拢,直接赋值为白
            if img_load[x, y] <= g:
                img_load[x, y] = 0
            else:
                img_load[x, y] = 255
    return imgL

# 擦除噪点,对L模式下的图处理
# x,y 像素点坐标
# g 阈值(0-255之间的灰度值)
# n 强度(周围有几个符合阈值的像素点才留下)
def wipe_spot(img, x, y, g, n):
    count = 0
    if img[x - 1, y + 1] == g:
        count += 1
    if img[x, y + 1] == g:
        count += 1
    if img[x + 1, y + 1] == g:
        count += 1
    if img[x - 1, y] == g:
        count += 1
    if img[x + 1, y] == g:
        count += 1
    if img[x + 1, y - 1] == g:
        count += 1
    if img[x, y - 1] == g:
        count += 1
    if img[x + 1, y - 1] == g:
        count += 1
    if count < n:
        img[x, y] = 255


# 示例
imgl = parse("/Users/chenyong/PycharmProjects/untitled/1.jpg", 150)
imgload = imgl.load()
for y in range(imgl.size[1]):
    for x in range(imgl.size[0]):
        if imgload[x, y] == 0:
            wipe_spot(imgload, x, y, 0, 1)
imgl.show()
print (image_to_string(imgl).replace(' ', ''))
谷歌OCR光学字符识别

 

posted @ 2018-08-31 22:27  我笑了  阅读(59)  评论(0)    收藏  举报