selenium 验证码登录_基于selenium实现12306的登录操作(图形验证码识别)

932845aa0872891d60c77711f497fe41.png

说明

12306 会有如下一个图形验证码识别点击,所以必须得先点击正确图片,才能继续进行操作。

2bdd804a34969cb9eb9dcf67c2b15105.png

基本步骤

  1. selenium打开对应网站,并进行截图
  2. 将图片截取出对应验证码所在图片
  3. 通过超级鹰识别出要点击的图片坐标
  4. 点击相应图片坐标
  5. 输入用户名和密码
  6. 点击登录,完成12306的登录

演示操作

v2-a27e5c1ef0c8c2e552cb4d03a2a43898_b.gif

代码

 # !/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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一种可能的实现方法: 1. 首先使用 pip 安装 selenium 模块: ``` pip install selenium ``` 2. 在代码中导入必要的模块: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException import time ``` 3. 创建 webdriver 对象,并打开登录页面: ```python driver = webdriver.Chrome() driver.get('https://example.com/login') ``` 其中 `https://example.com/login` 是登录页面的网址,可以替换为实际的网址。 4. 输入用户名和密码: ```python username = driver.find_element_by_id('username') password = driver.find_element_by_id('password') username.send_keys('your_username') password.send_keys('your_password') password.send_keys(Keys.RETURN) ``` 这里假设登录页面有两个文本框,分别用 `id` 属性为 `username` 和 `password` 的元素表示。 5. 等待一段时间,直到验证码出现: ```python while True: try: captcha = driver.find_element_by_id('captcha') break except NoSuchElementException: time.sleep(1) ``` 这里假设验证码是一个 `id` 为 `captcha` 的元素。 6. 将验证码图片保存到本地,并调用外部程序(如 tesseract)进行识别: ```python captcha_screenshot = captcha.screenshot_as_png with open('captcha.png', 'wb') as f: f.write(captcha_screenshot) # 调用 tesseract 进行识别 import subprocess result = subprocess.run(['tesseract', 'captcha.png', 'stdout', '-c', 'tessedit_char_whitelist=0123456789'], capture_output=True, text=True) captcha_code = result.stdout.strip() ``` 这里假设已经安装了 tesseract,并将其添加到了系统环境变量中。 7. 将识别结果填入验证码文本框,完成登录: ```python captcha_input = driver.find_element_by_id('captcha_input') captcha_input.send_keys(captcha_code) captcha_input.send_keys(Keys.RETURN) ``` 这里假设验证码文本框的 `id` 为 `captcha_input`。 整个过程就是这样了,以上代码仅供参考,实际使用时需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值