1.导入我们需要的模块,urllib.request模块用来获取我们所需要的验证码,image,itertool模块用来处理我们得到的验证码。
import urllib.request
import time
from PIL
import Image
import itertools
import os
2.将我们取得的验证码图片保存到当前目录文件夹下,通过对验证码图片黑白化后,分析图片的像素,去除干扰线或者干扰点。
class
CodeReptile():
def
__init__(
self,
number):
self.number = number
def
Code(
self):
im_url =
'http://jwc2.yangtzeu.edu.cn:8080/verifycode.aspx'
#需要爬取验证码的网站
path =
'.
\\
img'
path_cv =
'.
\\
img_cv'
folder = os.path.exists(path)
folder_cv = os.path.exists(path_cv)
if
not folder:
#判断是否存在img文件夹如果不存在则创建为文件夹
os.makedirs(path)
#makedirs 创建文件时如果路径不存在会创建这个路径
print(
"--- 创建img文件夹成功 ---" )
for i
in
range(
0,
self.number):
im_data = urllib.request.urlopen(im_url).read()
with
open(
'.
\\
img
\\
Code'+
str(i)+
'.jpg',
"wb")
as f:
f.write(im_data)
time.sleep(
0.05)
print(
"--- 验证码爬取完成 ---")
else:
print(
"--- img文件夹已存在 ---")
if
not folder_cv:
#判断是否存在img_cv文件夹如果不存在则创建为文件夹
os.makedirs(path_cv)
print(
"--- 创建img_cv文件夹成功 ---" )
else:
print(
"--- img_cv文件夹已存在 ---")
class
ImageCv():
def
__init__(
self,
img_path,
number):
self.img = Image.open(img_path).convert(
'L')
self.number = number
# 转化为黑白图
def
blackWrite(
self):
blackXY = []
# 遍历像素点
for x
in
range(
self.img.size[
0]):
for y
in
range(
self.img.size[
1]):
#print(img.getpixel((x,y)))
if
self.img.getpixel((x,y))<
128:
self.img.putpixel((x,y),
0)
# 置为黑点
blackXY.append((x,y))
else:
self.img.putpixel((x,y),
255)
# 置为白点
return blackXY
# 去除干扰点
def
clrImg(
self):
# 获取周围黑点的个数
pointArr =
self.blackWrite()
def
getN(
p):
count =
0
x = [p[
0]-
1,p[
0],p[
0]+
1]
y = [p[
1]-
1,p[
1],p[
1]+
1]
for i
in itertools.product(x,y):
# 笛卡尔积
try:
if
self.img.getpixel(i) ==
0:
count +=
1
except:
#print('out of')
continue
#print(count)
return count
for p
in pointArr:
if getN(p)<
4:
# 周围黑点个数 <5 的黑点认为是干扰点,置为白点
self.img.putpixel(p,
255)
self.img.save(
'.
\\
img_cv
\\
Code'+
str(
self.number)+
'.jpg')
#存放处理后的验证码
class
Start():
def
__init__(
self,
times):
self.times = times
def
start(
self):
start_codereptile = CodeReptile(
self.times)
start_codereptile.Code()
for i
in
range(
self.times):
img_path =
'.
\\
img
\\
Code'+
str(i)+
'.jpg'
image_cv = ImageCv(img_path,i)
image_cv.blackWrite()
image_cv.clrImg()
print(
"--- 验证码处理完成 ---")
start_project =Start(
10)
#需要爬取和处理的验证码数目
start_project.start()
3.最后,我们取得的验证码和处理后的验证码会存储到img和img_cv文件夹下。
4.借鉴了前辈们的一些代码,也是第一次编写类似python程序,代码优化有很多不足的地方,望大家见谅。