python 爬虫 selenium 模拟登录12306

目标网站
在这里插入图片描述
第一步先发起请求,点击账号登录
在这里插入图片描述
会出现登录界面,需要输入账号密码以及验证码
在这里插入图片描述
选择输入框,传入账号和密码
在这里插入图片描述
接着定位验证码元素,获取验证码的图片地址
在这里插入图片描述
在这里插入图片描述
保存验证码到本地
在这里插入图片描述
发送到打码平台获取正确选项
在这里插入图片描述
接下来要根据识别结果点击图片
先用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()


猜你喜欢

转载自blog.csdn.net/weixin_43751840/article/details/88423031