selenium + pytesseract 实现自动识别验证码实现自动打卡

1、步骤:

利用 chromedriver 打开浏览器 --> 登陆网站(识别验证码)–> 自动化操作

2、难点:

2.1、登陆网站:

本来想用 cookie,但是我们学校的网站的 cookie 中 httponly = False,不能用这种方式绕过登陆。只能识别出验证码后登陆,过了登陆这关后便是一马平川。

2.2、网站元素的识别:

世界上最遥远的距离,不是生与死,而是你在我眼前,我却识别不了你。
selenium 提供多种元素识别方式,常用的有 id、name、class、xpath 等,一种方式识别不了就换另一种,针对不同元素(不同网页)识别的方式也不同,可参考https://blog.csdn.net/qq_32897143/article/details/80383502

3、环境要求:

  • selenium
  • pytesseract
  • pillow

在命令行使用pip命令安装以上第三方库,默认的安装方式很慢,使用镜像网站安装会快很多,直接复制下面这行到 cmd
pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ selenium

安装完以上库后,还需安装chromedriver(selenium的浏览器驱动,edge或firefox也可)和 tesseract(用于识别出验证码)

安装 chromedriver:打开网站,找到对应自己的版本后下载,将 chromedriver.exe 文件复制到python的Scripts文件夹下(在cmd中用where python命令可找到自己的安装路径)

安装tesseract:参照https://blog.csdn.net/showgea/article/details/82656515

4、完整代码:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from selenium import webdriver
from selenium.webdriver.support.select import Select #专门用来处理下拉框
import pytesseract
import os
import sys,time
from PIL import Image,ImageEnhance
website= 'https://www.xxx.com' #打卡的网站
img_address = 'C:\\Users\\HP--\\Pictures\\喜欢的照片\\image1.png' #将验证码图片下载下来后存放的地址,

driver = webdriver.Chrome()
driver.maximize_window()d
cnt = 0 #计数多少次识别验证码才成功

while True: #循环识别验证码直到成功
driver.get(website)
driver.get_screenshot_as_file(img_adress) #将整个网页截图

img =Image.open(img_address)
box = (1217 , 496 , 1310 , 541) #设置要裁剪的区域
img = img.crop(box) #裁剪出只有验证码的图片(用【画图】打开截下的图片,鼠标滑到验证码的左上和右下,两个坐标就是要裁剪的区域。顺序:左上横坐标,左上纵坐标,右下横坐标,右下纵坐标)
img.save(img_address) #将图片更新为截下的只有验证码的图

vc = pytesseract.image_to_string(img_address) #保存验证码
account = 'xxxxx'
password = 'xxxxx'

try:
driver.find_element_by_name("account").send_keys(account)
driver.find_element_by_name("password").send_keys(password)
driver.find_element_by_name("rancode").send_keys(verfication_code)
driver.find_element_by_class_name("login").click()

if(driver.find_element_by_id("rancode-tips")): #这里是验证码识别不正确点击登陆后出现的错误信息
cnt += 1
continue
except: #正确识别后成功登陆,退出while循环
break

try: #会出现一些我不知道原因的错误,所以还是用异常捕获吧
driver.find_element_by_class_name("bdorange.bg_health").click()
driver.find_element_by_link_text("健康打卡").click()
driver.find_element_by_id("cph_right_ok_submit").click()

opt = driver.find_element_by_id("cph_right_e_area")
s = Select(opt)
s.select_by_visible_text('XX省')
#以上三句用select方法处理下拉框

driver.find_element_by_id('cph_right_e_location').send_keys('XX市')
driver.find_element_by_id('cph_right_e_observation_0').click()
driver.find_element_by_id('cph_right_e_health_0').click()
driver.find_element_by_id('cph_right_e_temp').send_keys('36.6')
driver.find_element_by_id('cph_right_e_survey01_0').click()
driver.find_element_by_id('cph_right_e_submit').click()
except:
pass

driver.quit()
print('经过{}次尝试,自动健康打卡完成!'.format(cnt))

5、说明:

以上程序不具有设备无关性,因为是直接截图下来后保存再截下验证码所在区域那块,不同计算机的屏幕不一样,所以验证码的坐标值应该也不一样。如果写完程序想发给同学试试记得要做一些修改,不然Ta会以为你不行!!!selenium 是用来模仿人在浏览器上的操作的,若是想更好的地模仿,应该在每下操作后用 time.sleep() 停顿一两秒。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!