python 爬虫 selenium 模拟登录12306

目标网站
python 爬虫 selenium 模拟登录12306_第1张图片
第一步先发起请求,点击账号登录
python 爬虫 selenium 模拟登录12306_第2张图片
会出现登录界面,需要输入账号密码以及验证码
python 爬虫 selenium 模拟登录12306_第3张图片
选择输入框,传入账号和密码
python 爬虫 selenium 模拟登录12306_第4张图片
接着定位验证码元素,获取验证码的图片地址
python 爬虫 selenium 模拟登录12306_第5张图片
在这里插入图片描述
保存验证码到本地
python 爬虫 selenium 模拟登录12306_第6张图片
发送到打码平台获取正确选项
python 爬虫 selenium 模拟登录12306_第7张图片
接下来要根据识别结果点击图片
先用ps获得每个选项的相对位置
python 爬虫 selenium 模拟登录12306_第8张图片
得到8张图片的相对坐标
在这里插入图片描述
然后用ActionChains模拟移动鼠标,点击操作
python 爬虫 selenium 模拟登录12306_第9张图片
打印验证码选项
在这里插入图片描述
选项8被点击
python 爬虫 selenium 模拟登录12306_第10张图片
最后点击立即登录按钮,完成登录流程
在这里插入图片描述
在这里插入图片描述
以下是完整代码:

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()


你可能感兴趣的:(python 爬虫 selenium 模拟登录12306)