#Python模拟登录教务网(!附源码!)#
一:使用selenium 库调用谷歌浏览器
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://sdjwxt.syu.edu.cn/jsxsd/')
二:抓取Xpath使用send_key方法自动填充账号密码
#自动输入账号与密码
driver.find_element_by_xpath('//*[@id="userAccount"]').send_keys('F1659128')
driver.find_element_by_xpath('//*[@id="userPassword"]').send_keys(password.PW)
如图所示抓取Xpath:
三:验证码的获取以及转化
1.首先截取全屏为图片a
2.利用验证码的XPath获取其坐标以及长短
3.根据坐标截取验证码图片为图片b
4.处理图片b,然后利用pytesseract库将其转化为数字
#截取屏幕
driver.save_screenshot(‘a.png’)
#得到验证码的坐标
y_element =driver.find_element_by_xpath('//*[@id="SafeCodeImg"]')
print(y_element.location)
print(y_element.size)
#截取验证码图片
left = y_element.location['x']
top = y_element.location['y']
right = left + y_element.size['width']
button = top + y_element.size['height']
im = Image.open('a.png')
im = im.crop((left,top,right,button))
im.save('b.png')
#识别验证码
text = Image.open('c.png')
result = pytesseract.image_to_string(text)
resultj = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", result) # 去除识别出来的特殊字符
result_four = resultj[0:4] # 只获取前4个字符
print(resultj)
最终将转化的验证码填入并点击登陆即可!
driver.find_element_by_xpath('//*[@id="RANDOMCODE"]').send_keys(resultj)
driver.find_element_by_xpath('//*[@id="ul1"]/li[5]/button').click()
run登陆成功!
说说遇到的坑:
1.安装pycharm的时候没理解解释器,在后来的导包时遇到一些列问题
避坑指南:https://www.runoob.com/w3cnote/pycharm-windows-install.html
2.命令行pip install 包时无法下载
避坑指南:https://blog.csdn.net/weay/article/details/82261442
3.验证码转数字精确度未达到80%,有待于改善。
4.Pytesseract 图像验证码识别 PyCharm 报错FileNotFoundError
避坑指南:https://blog.csdn.net/u010134642/article/details/78747630
大概就这些吧,下一步爬成绩保存至文档!python新手,大家多多交流!
完整代码:
#pip selenium 安装对应的谷歌驱动放在python目录下,自动打开谷歌浏览器并访问网址
from selenium import webdriver
import password
import re
#验证码图片转文字
import pytesseract
#图形化处理库
from PIL import Image
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://sdjwxt.syu.edu.cn/jsxsd/')
#自动输入账号与密码
driver.find_element_by_xpath('//*[@id="userAccount"]').send_keys('F1659128')
driver.find_element_by_xpath('//*[@id="userPassword"]').send_keys(password.PW)
#截取屏幕
driver.save_screenshot('a.png')
#得到验证码的坐标
y_element =driver.find_element_by_xpath('//*[@id="SafeCodeImg"]')
print(y_element.location)
print(y_element.size)
#截取验证码图片
left = y_element.location['x']
top = y_element.location['y']
right = left + y_element.size['width']
button = top + y_element.size['height']
im = Image.open('a.png')
im = im.crop((left,top,right,button))
im.save('b.png')
#图片处理
img = Image.open('b.png')
img = img.convert('L') # P模式转换为L模式(灰度模式默认阈值127)
count = 165 # 设定阈值
table = []
for i in range(256):
if i < count:
table.append(0)
else:
table.append(1)
img = img.point(table, '1')
img.save('c.png') # 保存处理后的验证码
#识别验证码
text = Image.open('c.png')
result = pytesseract.image_to_string(text)
resultj = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", result) # 去除识别出来的特殊字符
result_four = resultj[0:4] # 只获取前4个字符
print(resultj)
#处理验证码并点击登录
driver.find_element_by_xpath('//*[@id="RANDOMCODE"]').send_keys(resultj)
driver.find_element_by_xpath('//*[@id="ul1"]/li[5]/button').click()