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: 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省')
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() 停顿一两秒。