python模拟登录12306_python基于selenium模块实现自动登录12306网站

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值