selenium自动打开页面输入账号密码
from selenium import webdriver
from time import sleep
# 实例化一个web对象
driver = webdriver.Chrome(executable_path='chromedriver.exe')
# 请求12306登录页面
driver.get('https://kyfw.12306.cn/otn/resources/login.html')
# 浏览器窗口最大化显示
driver.maximize_window()
# 切换到账号密码登录界面
driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()
sleep(6)
# 输入账号和密码
driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('15523456679')
sleep(0.5)
driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('用户密码')
sleep(0.5)
页面有个点击验证码,我们需要先将验证码识别,识别验证码需要用到打码平台,我们以联众举例。
图片中鼠标选中那块儿就是我们需要的图片数据。
import json
import requests
import base64
# 定位到验证码图片标签
code_img = driver.find_element_by_xpath('//*[@id="J-loginImg"]')
# 取出页面中验证码图片数据
code_src = code_img.get_attribute('src')
upload = code_src.replace('data:image/jpg;base64,', '')
# 图片解码以及保存 ps:这几个步骤可以不要,主要是方便测试使用
with open('code.png', 'wb') as f:
f.write(base64.b64decode(upload))
return upload, code_img
# 登录联众打码自动识别验证码图片
def get_code():
railway = railway_ticket()
upload = railway[0]
code_img = railway[1]
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'}
url = 'https://v2-api.jsdama.com/upload'
data = {
"softwareId": 14011,
"softwareSecret": "ShMyfUfvkhtccviMXAWCIVXZRfKlXHTER8oJUr3h",
"username": "联众账号",
"password": "联众密码",
"captchaData": upload,
"captchaType": 1303,
"captchaMinLength": 1,
"captchaMaxLength": 8,
"workerTipsId": 0,
}
data = json.dumps(data)
try:
result = requests.post(url=url, data=data, headers=headers).json()
print(result)
success = result['code']
# 定义一个存储点击坐标的列表
all_list = []
recognition = result['data']['recognition']
# 判断验证码是否识别成功
if success == 0:
print('验证码坐标识别成功!', recognition)
# 取出结果中的点击坐标
if '|' in recognition:
list1 = recognition.split('|')
count_list = len(list1)
for i in range(count_list):
xy_list = []
x = int(list1[i].split(',')[0])
y = int(list1[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
print('all_list:', all_list)
for j in all_list:
x = j[0]
y = j[1]
ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
sleep(0.5)
else:
x = int(recognition.split(',')[0])
y = int(recognition.split(',')[1])
print('xy为:', x, y)
ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
sleep(3)
# 验证码识别成功以后,点击登录按钮
driver.find_element_by_xpath('//*[@id="J-login"]').click()
点击图片识别成功以后,点击登录会再弹出一个滑块验证码,这次我们加入动作链即可识别成功
# 识别滑块验证码需要用到的模块
from selenium.webdriver import ActionChains
# 加入动作链
# 规避检测使用selenium的解决方法 ,如果不加入这两行代码,会显示出错。
script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
driver.execute_script(script)
sleep(3)
div_tag = driver.find_element_by_xpath('//*[@id="nc_1_wrapper"]')
# 对div_tag进行滑动操作
action = ActionChains(driver) # 实例化一个动作对象
# action.click_and_hold(div_tag).perform() # 点击且长按不放
# x偏移20像素,y偏移0像素
action.drag_and_drop_by_offset(div_tag, 400, 0).perform()
sleep(10)
action.release()
# 滑块识别成功以后会自动跳转到用户登录成功首页。这时候我们的整个自动登录过程就实现了。
本次模拟自动登录的完整代码:
from selenium import webdriver
from time import sleep
import json
import requests
import base64
from selenium.webdriver import ActionChains
def railway_ticket():
# 切换到账号密码登录界面
driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()
sleep(6)
# 获取全局截图
driver.save_screenshot('login.png')
sleep(1)
# 输入账号和密码
driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('15523456679')
sleep(0.5)
driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('用户密码')
sleep(0.5)
# 定位到验证码图片标签
code_img = driver.find_element_by_xpath('//*[@id="J-loginImg"]')
code_src = code_img.get_attribute('src')
upload = code_src.replace('data:image/jpg;base64,', '')
# 图片解码以及保存 ps:这几个步骤可以不要,主要是方便测试使用
with open('code.png', 'wb') as f:
f.write(base64.b64decode(upload))
return upload, code_img
# 登录联众打码自动识别验证码图片
def get_code():
railway = railway_ticket()
upload = railway[0]
code_img = railway[1]
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'}
url = 'https://v2-api.jsdama.com/upload'
data = {
"softwareId": 14011,
"softwareSecret": "ShMyfUfvkhtccviMXAWCIVXZRfKlXHTER8oJUr3h",
"username": "联众账号",
"password": "联众密码",
"captchaData": upload,
"captchaType": 1303,
"captchaMinLength": 1,
"captchaMaxLength": 8,
"workerTipsId": 0,
}
data = json.dumps(data)
try:
result = requests.post(url=url, data=data, headers=headers).json()
print(result)
success = result['code']
# 定义一个存储点击坐标的列表
all_list = []
recognition = result['data']['recognition']
# 判断验证码是否识别成功
if success == 0:
print('验证码坐标识别成功!', recognition)
# 取出结果中的点击坐标
if '|' in recognition:
list1 = recognition.split('|')
count_list = len(list1)
for i in range(count_list):
xy_list = []
x = int(list1[i].split(',')[0])
y = int(list1[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
print('all_list:', all_list)
for j in all_list:
x = j[0]
y = j[1]
ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
sleep(0.5)
else:
x = int(recognition.split(',')[0])
y = int(recognition.split(',')[1])
print('xy为:', x, y)
ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()
sleep(3)
# 验证码识别成功以后,点击登录按钮
driver.find_element_by_xpath('//*[@id="J-login"]').click()
# 加入动作链
sleep(3)
div_tag = driver.find_element_by_xpath('//*[@id="nc_1_wrapper"]')
# 对div_tag进行滑动操作
action = ActionChains(driver) # 实例化一个动作对象
# action.click_and_hold(div_tag).perform() # 点击且长按不放
# x偏移20像素,y偏移0像素
action.drag_and_drop_by_offset(div_tag, 400, 0).perform()
sleep(10)
action.release()
# 检查是否登陆成功
print('用户登陆成功!')
else:
print('验证码坐标识别失败!', recognition)
except:
print('用户登录失败!')
return driver
def select():
sever = get_code()
sever.find_element_by_class_name('modal-close').click()
sleep(5)
print(driver.page_source)
sleep(3)
sever.find_element_by_xpath('//*[@id="J-index"]/a').click()
sleep(10)
if __name__ == '__main__':
# 实例化一个web对象
driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get('https://kyfw.12306.cn/otn/resources/login.html')
# 浏览器窗口最大化显示
driver.maximize_window()
# 规避检测使用selenium的解决方法 滑块登录那边要用到
script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
driver.execute_script(script)
select()
driver.quit()