这里以查询深圳住房公积金为例(http://gjj.sz.gov.cn/fzgn/zfcq/)
from selenium import webdriver # 模拟浏览器操作
from PIL import Image # 图像处理
import time
import pytesseract # 验证码识别
# 加载等待时用到
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 获取公积金余额信息,输入:电脑号,身份证号
def getInfo(computerID,IDnumber):
'''
1.页面请求
'''
# http://gjj.sz.gov.cn/fzgn/zfcq/ 经查看左边原网址iframe标签发现输入框嵌入了下面的地址
url = "http://app.szzfgjj.com:7001/pages/sj_yecx.jsp"
browser = webdriver.Firefox()
browser.get(url)
browser.maximize_window() # 最大化
#print(browser.page_source)
# 等待加载完成
#time.sleep(1)
# 显示等待5s,等待元素加载(等某个条件发生后再继续执行后续代码)
# 显示等待和隐式等待区别:https://blog.csdn.net/cyjs1988/article/details/76033180
try:
locator = (By.ID,"rad_1")
WebDriverWait(browser,5).until(EC.presence_of_element_located(locator))
except: # 超时则提示加载失败,浏览器退出并返回
print("load fail")
browser.quit()
return
'''
2.输入信息
'''
# 选中个人社保电脑号按钮
browser.find_element_by_id("rad_1").click()
# 输入社保电脑号
ComputerNumber_input = browser.find_element_by_id("accnum1")
ComputerNumber_input.send_keys(computerID)
# 获取身份证输入框
IDNumber_input = browser.find_element_by_id("certinum1")
# 输入身份证号码
IDNumber_input.send_keys(IDnumber)
'''
3.自动识别验证码处理
'''
# 找到验证码位置
VerifyCode = browser.find_element_by_id("imgyzm")
location = VerifyCode.location
# 获取验证码的size
size = VerifyCode.size
#写成我们需要截取的位置坐标 ,这里获得(x,y)为矩形左下角的坐标,(x+width,y+height)为对应右上角的坐标
rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
#print(rangle)
# 先保存整个网页截图
name = "fullpage.png"
browser.save_screenshot(name)
# 通过PIL中的crop剪切图片
image = Image.open(name)
codeArea = image.crop(rangle) # 使用Image的crop函数(对图片进行剪切处理),从截图中再次截取我们需要的区域
codeArea.save("code_raw.png") # 保存截取的验证码图片
# 对图片进行二值化处理(尴尬的是这里不做二值化处理,在下面经过放大处理后依然可以正确识别,权当研究下)
out = ImageProcess("code_raw.png")
# 获取图片大小
x,y = out.size
#print(x,y) # 60 20
# 放大图片(经测试这里不放大,没法识别,原图size有点小)
resize_img = out.resize((x*2,y*2)) #print(transform.rescale(img, 2).shape) #放大为原来图片大小的2倍
#print(reimg.size) (120, 40)
resize_img.save("code_erzhihua.png")
result = pytesseract.image_to_string(resize_img,lang = "eng")
print("result",result)
# 输入验证码
browser.find_element_by_id("verify").send_keys(result)
'''
4.查询
'''
# 点击查询按钮
browser.find_element_by_id("but_2").click()
# 以下打印不出结果,待进一步研究
#time.sleep(2)
#elements = browser.find_element_by_class_name("form_yecx_out")
#print(elements.text)
# 关闭此页面
#browser.close()
# 退出浏览器
#browser.quit()
# 对图片进行简单的二值化处理
def ImageProcess(image):
image = Image.open(image)
image = image.convert("L") # 灰色模式
table = []
threshold = 140
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
return image.point(table,"1") # Image.point()方法操作像素数据
getInfo("你的电脑号","你的身份证号")
reference:
https://blog.csdn.net/dcba2014/article/details/78969658
http://hankerzheng.com/blog/chenge-the-size-of-pic-by-python-pil
https://blog.csdn.net/kethur/article/details/79992539