说明
12306 会有如下一个图形验证码识别点击,所以必须得先点击正确图片,才能继续进行操作。
基本步骤
- selenium打开对应网站,并进行截图
- 将图片截取出对应验证码所在图片
- 通过超级鹰识别出要点击的图片坐标
- 点击相应图片坐标
- 输入用户名和密码
- 点击登录,完成12306的登录
演示操作
代码
# !/user/bin/env python
# -*- coding: utf-8 -*-
from chaojiying import get_code
from selenium import webdriver
from time import sleep
from PIL import Image
from selenium.webdriver import ActionChains
if __name__ == '__main__':
browser = webdriver.Chrome('./chromedriver.exe')
browser.get('https://kyfw.12306.cn/otn/login/init')
# 因为验证码图片是不固定的,所以需要对页面进行截取
sleep(3)
# 浏览器截图
browser.save_screenshot('./page.png')
# 确认验证码图片的位置
code_img_ele = browser.find_element_by_xpath(
'/html/body/div[6]/div/form/div/ul[2]/li[4]/div/div/div[3]/img'
)
print(code_img_ele)
# 获得验证码图片的位置
location = code_img_ele.location
print(location)
# 获得验证码图片的长和宽
size = code_img_ele.size
pos_tuple = (
int(location['x']),
int(location['y']),
int(location['x'] + size['width']),
int(location['y'] + size['height']),
)
# 图片裁剪
i = Image.open('./page.png')
frame = i.crop(pos_tuple)
frame.save('./code.png')
# 使用超级鹰进行验证码识别
res = get_code('./code.png', '9004')['pic_str']
print('图片地址', res)
# 地址切割
point_list = res.split('|')
new_list = []
for point in point_list:
xy = point.split(',')
temp = [int(xy[0]), int(xy[1])]
new_list.append(temp)
print(new_list)
for point in new_list:
x = point[0]
y = point[1]
ActionChains(browser).move_to_element_with_offset(code_img_ele, x, y).click().perform()
sleep(0.1)
account = {
'username': '您自己的用户名(自行修改)',
'password': '您自己的密码(自行修改)'
}
username_input = browser.find_element_by_id('username')
password_input = browser.find_element_by_id('password')
username_input.send_keys(account['username'])
password_input.send_keys(account['password'])
submit_btn = browser.find_element_by_id('loginSub')
submit_btn.click()
sleep(60)
browser.quit()