步骤:打开浏览器–>登陆网站(识别验证码)–>自动化操作
难点:
1、验证码的识别:本来想用cookie,但是我们学校的网站的cookie中httponly = False,不能用这种方式绕过登陆。只能识别出验证码后登陆,过了登陆这关后便是一马平川。2、网站元素的识别:世界上最遥远的距离,不是生与死,而是你在我眼前,我却识别不了你。selenium提供多种元素识别方式,常用的有id、name、class、xpath等,一种方式识别不了就换另一种,针对不同元素(不同网页)识别的方式也不同,可参考https://blog.csdn.net/qq_32897143/article/details/80383502
环境要求:selenium pytesseract pillow
在命令行使用pip命令安装以上第三方库,默认的安装方式很慢,使用镜像网站安装会快很多,直接复制下面这行到cmd
pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ selenium
安装完以上库后,还需安装chromedriver(selenium的浏览器驱动,edge或firefox也可)和tesseract(用于识别出验证码)
安装chromedriver:打卡网站http://npm.taobao.org/mirrors/chromedriver/,找到对应自己的版本后下载,将chromedriver.exe文件复制到python的Scripts文件夹下(在cmd中用where python命令可找到自己的安装路径)
安装tesseract:参照https://blog.csdn.net/showgea/article/details/82656515
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[0]) #将整个网页截图
img =Image.open(img_address[0])
box = (1217 , 496 , 1310 , 541) #设置要裁剪的区域
img = img.crop(box) 裁剪出只有验证码的图片
img.save(img_address[0])
vc = pytesseract.image_to_string(img_address[0]) 保存验证码
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('广东省') #以上三句处理下拉框
driver.find_element_by_id('cph_right_e_location').send_keys('汕头市')
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))