python实现教务处验证码爬取和处理

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程序,代码优化有很多不足的地方,望大家见谅。

猜你喜欢

转载自blog.csdn.net/qq_39506912/article/details/80348531
今日推荐