Python selenium 包自动登录教务处

Python selenium 包自动登录教务处

本文中的Python脚本:JNU_login.py
这个是昨晚熬夜弄到凌晨四点搞出来的成果。虽然没有达到自己想要的自动选课效果,但是值得记录下来。似乎这个学期的自己几乎每周都有一两天是两三点之后睡觉了,着实需要注意一下了!

和暨南大学能耗查询系统不一样的是,我们学校的教务处需要验证码登录:

因此如果想实现自动登录,必须解决验证码识别的问题。很遗憾我没解决,因为识别的正确率实在是太低了。所以最后我把验证码识别换成了手动输入。不过关于图像识别还是一个蛮有趣的包。

图像识别与文本提取

我们以下面的这个文本图片为例:

1
2
3
4
5
import pytesseract.pytesseract
from PIL import Image
image = Image.open('test.png')
code = pytesseract.image_to_string(image)
print(code)

这个pytesseract包非常奇怪,其安装可以百度一下,我安装的过程遇到了很多问题,我安装了所有需要的东西,但是就是无法import,最后我收到从github上下载了这个包然后放到了系统文件夹里。使用下面的命令即可查看系统文件夹的位置:

1
2
3
4
5
6
7
8
9
10
11
12
import sys
sys.path

Out[6]:
['/Applications/PyCharm.app/Contents/helpers/pydev',
'/Applications/PyCharm.app/Contents/helpers/pydev',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/IPython/extensions',
'/Users/mr.cheng/Desktop/Python_for_Finance']

我是放在了倒数第三个文件夹里。不过从github下载的包直接放进去还不能调用,需要修改一下:点击这个即可下载我修改好的:pytesseract.zip

装好这个包之后就能进行图像识别和文本提取了:

1
2
3
4
5
6
7
8
9
This is a lot of 12 point text to test the
cor code and see if it works on all types
of file format.

The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.

在安装了中文语言包之后就可以用来识别中文了,详细可以参考这篇博客:mac上文字识别(Tesseract-OCR for mac)以及各国语言下载的Github仓库:tessdata。例如识别下面的中文图图片:

需要增加一个指定中文的选择项:

1
2
3
4
5
6
7
8
9
10
11
12
13
import pytesseract.pytesseract
from PIL import Image
image = Image.open('test2.png')
code = pytesseract.image_to_string(image, lang='chi_sim')
print(code)
with open("output.txt", "w") as f: # 将识别出来的文字存到本地
f.write(str(code))

这个是昨晚熬夜弄到凌晨四点搞出来的成
果。 虽然没有达到自己想要的自动选课效
果, 但是值得记录下来。 似乎这个学期的
自己几乎每周都有一两天是两三点之后髦
觉了, 着实需要注意一下了 !

因为这个方法识别验证码的效率太低了,所以还是放弃了。

selenium登录登录教务处

主要的代码和上一篇还是一样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from os import environ
from selenium import webdriver
# import pytesseract.pytesseract
# from PIL import Image
user = '你的学号'
password = '你的教务处登录密码'
chromedriver = "/usr/local/bin/chromedriver"
environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('https://jwxt.jnu.edu.cn/')
driver.implicitly_wait(3)
account = driver.find_element_by_xpath('//*[@id="txtYHBS"]')
passwd = driver.find_element_by_xpath('//*[@id="txtYHMM"]')
account.send_keys(user)
passwd.send_keys(password)
# cpatcha = driver.find_element_by_xpath('//*[@id="Table16"]/tbody/tr[9]/td[3]/img')
# driver.save_screenshot('page.png')
# left = 1180
# top = 658
# right = 1290
# bottom = 705
# img = Image.open('page.png')
# img = img.crop((left,top,right,bottom))
# img.save('captcha.png')
# image = Image.open('captcha.png')
# code = pytesseract.image_to_string(image)
# print(code)
valid = driver.find_element_by_xpath('//*[@id="txtFJM"]')
ma = input(">请自行输入验证码:")
valid.send_keys(ma)
login = driver.find_element_by_xpath('//*[@id="btnLogin"]')
login.click()
driver.close()

上面被注释掉的部分实际上也是我在尝试使用图像识别解决验证码问题的时候写的。思路是首先将整个界面截个图,然后不断尝试验证码所在的位置(虽然又一个location参数,但是不知道为什么确定的位置不对),然后从整个截图中截取得到验证码的图片,在对截图进行图像识别。嗯,效果不好。

封装成一个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def JNU_login(user, password):
"""
自动登录暨南大学教务处
:param user: 学号
:param password: 密码
:return: 在手动验证码之后,会自动弹出一个登录后的浏览器界面
"""
from os import environ
from selenium import webdriver
chromedriver = "/usr/local/bin/chromedriver"
environ['webdriver.chrome.driver'] = chromedriver
driver = webdriver.Chrome(chromedriver)
driver.get('https://jwxt.jnu.edu.cn/')
driver.implicitly_wait(3)
account = driver.find_element_by_xpath('//*[@id="txtYHBS"]')
passwd = driver.find_element_by_xpath('//*[@id="txtYHMM"]')
account.send_keys(user)
passwd.send_keys(password)
valid = driver.find_element_by_xpath('//*[@id="txtFJM"]')
ma = input(">请自行输入验证码:")
valid.send_keys(ma)
login = driver.find_element_by_xpath('//*[@id="btnLogin"]')
login.click()
driver.close()
# Python

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×