目标网站
第一步先发起请求,点击账号登录
会出现登录界面,需要输入账号密码以及验证码
选择输入框,传入账号和密码
接着定位验证码元素,获取验证码的图片地址
保存验证码到本地
发送到打码平台获取正确选项
接下来要根据识别结果点击图片
先用ps获得每个选项的相对位置
得到8张图片的相对坐标
然后用ActionChains模拟移动鼠标,点击操作
打印验证码选项
选项8被点击
最后点击立即登录按钮,完成登录流程
以下是完整代码:
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
url = 'https://kyfw.12306.cn/otn/resources/login.html'
# 创建浏览器对象
window = webdriver.Chrome('./chromedriver')
window.get(url)
time.sleep(2)
# 点击账号登录
account_login_button = window.find_element_by_xpath('//div[@class="login-box"]/ul/li[2]/a')
account_login_button.click()
# 输入账号
input_account = window.find_element_by_id('J-userName')
input_account.send_keys('账号')
# 输入密码
input_password = window.find_element_by_id('J-password')
input_password.send_keys('密码')
# 获取验证码图片
time.sleep(1)
img_ele = window.find_element_by_id('J-loginImg')
src = img_ele.get_attribute('src')
from urllib import request
request.urlretrieve(src,'./img_1.png')
print('图片已保存')
# 发送到打码平台
from YDMHTTP import decode
result = decode('img_1.png',6701)
print('选项',result) # 返回的是字符串
# 根据识别结果点击图片
position_list = [(40,70), (110,70),(180,70),(252,70),(40,150),(110,150),(180,150),(250,150)]
if result != '看不清':
for position in result:
ActionChains(window).move_to_element_with_offset(img_ele,position_list[int(position)-1][0],position_list[int(position)-1][1]).click().perform()
# 点击登录按钮
login_button = window.find_element_by_id('J-login')
login_button.click()
优化了等待时间,使用了API,从固定时间改成了每隔0.1秒请求一次,尝试时间为60秒
from selenium import webdriver
from selenium.webdriver import ActionChains
# 导入显性等待的API需要的模块
# 1> 等待对象模块
from selenium.webdriver.support.wait import WebDriverWait
# 2> 导入等待条件模块
from selenium.webdriver.support import expected_conditions as EC
# 3> 导入查询元素模块
from selenium.webdriver.common.by import By
url = 'https://kyfw.12306.cn/otn/resources/login.html'
# 创建浏览器对象
window = webdriver.Chrome('./chromedriver')
window.get(url)
# 点击账号登录
wait = WebDriverWait(window,60,0.1) # 创建等待对象
account_login_button = wait.until(EC.presence_of_element_located((By.XPATH,'//div[@class="login-box"]/ul/li[2]/a'))) # 这里locate里面放元组
account_login_button.click()
# 输入账号
input_account = window.find_element_by_id('J-userName')
input_account.send_keys('账号')
# 输入密码
input_password = window.find_element_by_id('J-password')
input_password.send_keys('密码')
# 获取验证码图片
img_ele = wait.until(EC.presence_of_element_located((By.ID,'J-loginImg')))
src = img_ele.get_attribute('src')
from urllib import request
request.urlretrieve(src,'./img_1.png')
print('图片已保存')
# 发送到打码平台
from YDMHTTP import decode
result = decode('img_1.png',6701)
print('选项',result) # 返回的是字符串
# 根据识别结果点击图片
position_list = [(40,70), (110,70),(180,70),(252,70),(40,150),(110,150),(180,150),(250,150)]
if result != '看不清':
for position in result:
ActionChains(window).move_to_element_with_offset(img_ele,position_list[int(position)-1][0],position_list[int(position)-1][1]).click().perform()
# 点击登录按钮
login_button = window.find_element_by_id('J-login')
login_button.click()