selenium模拟登录12306

利用selenium模拟登录12306,但是12306的登陆要想模拟还挺难的,需要先进行坐标识别,识别出来之后还要在进行滑块拖动验证识别,这里做一下记录.

这里的坐标识别是用的超级鹰,有时也会坐标识别出错,最后的一步滑动验证码识别现在做不了,不论是模拟滑动还是手动滑动都有问题。源代码如下(其中超级鹰的识别代码就不贴了)

from selenium import webdriver
from time import sleep
from PIL import Image
from selenium.webdriver import ChromeOptions  # 检测规避
from spider_basic.expand.chaojiying import verify_text


# 检测规避
options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])


brow = webdriver.Chrome(executable_path='./chromedriver.exe', options=options)
# 浏览器最大化操作,这里需要执行这个操作才能精确定位
brow.maximize_window()

brow.get('https://kyfw.12306.cn/otn/resources/login.html')
login_account_bnt = brow.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
# 选择账号密码登录
login_account_bnt.click()
sleep(2)  # 这里需要停顿保证选择验证码已刷新出来

# 填写用户名和密码
user = brow.find_element_by_xpath('//*[@id="J-userName"]')
user.send_keys('user')
pwd = brow.find_element_by_xpath('//*[@id="J-password"]')
pwd.send_keys('pwd')
brow.save_screenshot('./login.png')

# 确定验证码图片区域
verifycode_elem = brow.find_element_by_id('J-loginImg')
location = verifycode_elem.location  # 验证码图片左上角的坐标
print('location:', location)
size = verifycode_elem.size
print('size:', size)

# 刚开始把location_range写成了下面这样,我吐了
# range = (
#     int(location['x']) * 1.25, int(location['y']) * 1.25, int((location['x']) + size['width']) * 1.25,
#     int((location['x']) + size['width']) * 1.25
# )
location_range = (
    int(location['x']) * 1.25, int(location['y']) * 1.25, int((location['x']) + size['width']) * 1.25,
    int((location['y']) + size['height']) * 1.25
)


# crop根据指定区域进行图片裁剪
i = Image.open('./login.png')
verifycode_img_name = 'verify.png'
frame = i.crop(location_range)  # 接受一个4元素的元组,分别是左上角坐标和右下角坐标
frame.save(verifycode_img_name)

verify_data = verify_text(image_path=verifycode_img_name, type=9004) 
# verify_text这里的这个函数就是超级鹰识别然后返回结果的函数
print(verify_data)

pos = []
# if '|' in verify_data:  # 超过一个满足条件图片
total_list = verify_data.split('|')
for item_list in total_list:
    # x = int(item.split(',')[0])
    # y = int(item.split(',')[0])
    tmp_list = item_list.split(',')
    for item in tmp_list:
        val = int(item)
        pos.append(val)

for i in range(len(pos) // 2):
    x = pos[i*2]
    y = pos[i*2+1]
    webdriver.ActionChains(brow).move_to_element_with_offset(verifycode_elem, x, y).click().perform()
    sleep(0.5)

login_btn = brow.find_element_by_id('J-login')
login_btn.click()

# 加入动作链
# div_tag = brow.find_element_by_xpath('//*[@id="nc_1_n1z"]')
#
# # 对div_tag进行滑动操作
# action = webdriver.ActionChains(brow)
# action.click_and_hold(div_tag)
#
# for i in range(6):
#     # perform 让动作链立即执行
#     action.move_by_offset(20,0).perform() #偏移x20像素,y0像素
#     sleep(0.1)
# action.release()

  • 刚开始元组location_range 中右下角的坐标写错了,造成截图偏离,被搞了很长时间。后面更正了,截出来了但还是有些歪,后面查资料发现要让页面最大化就行了。
  • 有时会出错说登陆按钮定位有问题,这个不知道是啥原因。
  • 最终有一次识别成功,但后面的滑块验证过不了,这个是反爬机制的原因,因为即使最后手动拖动也会提示出错
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值