最近迷上了用selenium去登陆各大网站,别说selenium真挺好用,可以轻松搞定ajax动态加载的网页,不用很费劲的去抓包查找。咳咳…跑题了,回归正题。
这次用selenium去登录12306网站,听说比较困难。我就去试了试,发现它的验证码实在是那啥…就是这样的。听头疼的。

我来说说主要的代码编写吧。

过程:

  1. 用我们的开发者工具定位到输入账号和密码的窗口,找到并send_keys
driver.find_element_by_id('username').send_keys('用户名')
time.sleep(0.5)
driver.find_element_by_id('password').send_keys('密码')
  1. 然后复杂的过程就来了。我们想要得到验证码的图片。但是头疼的是,图片是再变化的。我们请求一次,就变化一次,不像其他普通网站一样不会变化,直接保存图片就行了。但是这是12306诶,哪这么轻松。想了想,我决定把整张页面截屏保存下来,然后对验证码区域裁剪下来,就可以保证一致了。
# 将页面进行截图并保存
driver.save_screenshot('12306登录页面截图.png')# 确定验证码左上角和右下角的坐标
code_img = driver.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
location = code_img.location  # 确定验证码图片左上角的坐标
print('location:', location)
size = code_img.size  # 确定验证码图片的长和宽
print('size:', size)
rangle = (int(location['x']), int(location['y']), int(location['x']) + int(size['width']),int(location['y']) + int(size['height']))
print('rangle:', rangle)
i = Image.open('12306页面截图.png')
# 对指定区域裁剪
code_pic = i.crop(rangle)
file_name = 'code_pic.png'
code_pic.save(file_name)
time.sleep(2)
print('验证码图片保存成功!!')
  1. 我们识别验证码用的是超级鹰,具体如何使用可以去查一查。验证码有可能需要我们点击多个,所以通过打码平台会得到多个坐标,就比如这种。有两个日历,需要点击两次,通过超级鹰就会得到两个坐标。如下图。我们发现有两个坐标会有一个“|”,有三个坐标就有两个“|”,所以我们就把他们split下,让每个坐标嵌套再一个列表里。此过程代码如下:
# 识别验证坐标
chaojiying = Chaojiying_Client('用户账号', '密码', '开发者账号')  # 用户中心>>软件ID 生成一个替换 96001
im = open('code_pic.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
result = chaojiying.PostPic(im, 9004)['pic_str']  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()all_list = []  # 存储被点击的坐标
if '|' in result:list1 = result.split('|')xy_list = []count1 = len(list1)for i in list1:x = int(list1[i].split(',')[0])xy_list.append(x)y = int(list1[i].split(',')[1])xy_list.append(y)all_list.append(xy_list)
else:xy_list = []x = int(result.split(',')[0])xy_list.append(x)y = int(result.split(',')[1])xy_list.append(y)all_list.append(xy_list)
print(all_list)

  1. 最后嘛,我们得到了验证码的坐标,当然就去点击啦。但是,这个坐标是相对于验证码的图片的坐标,我们必须用ActionChains来移动一下动作链的位置。把他移动到验证码图片的location。,然后点击就ok了。此步骤的代码如下:
# 循环遍历点击图片
for i in all_list:x = i[0]y = i[1]action = ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()time.sleep(1)
driver.find_element_by_id('loginSub').click()

最后来看看全部代码吧!!

这个代码是超级鹰提供的接口。我封装成一个类了。

#!/usr/bin/env python
# coding:utf-8import requests
from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword = password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()

下面是自己写的,也就六七十行。

from selenium import webdriver
from chaojiying_Python.chaojiying import Chaojiying_Client
import time
from PIL import Image
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options# 实现无可视化界面的操作
# chrome_options = Options()
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome('D:\software\studySoftware\chromedriver_win32\chromedriver.exe')
driver.get('https://kyfw.12306.cn/otn/login/init')
# driver.maximize_window()
time.sleep(1)
driver.find_element_by_id('username').send_keys('用户名')
time.sleep(0.5)
driver.find_element_by_id('password').send_keys('密码')
# 将页面进行截图并保存
driver.save_screenshot('12306登录页面截图.png')# 确定验证码左上角和右下角的坐标
code_img = driver.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
location = code_img.location  # 确定验证码图片左上角的坐标
print('location:', location)
size = code_img.size  # 确定验证码图片的长和宽
print('size:', size)
rangle = (int(location['x']), int(location['y']), int(location['x']) + int(size['width']),int(location['y']) + int(size['height']))
print('rangle:', rangle)
i = Image.open('12306页面截图.png')
# 对指定区域裁剪
code_pic = i.crop(rangle)
file_name = 'code_pic.png'
code_pic.save(file_name)
time.sleep(2)
print('验证码图片保存成功!!')
# 识别验证坐标
chaojiying = Chaojiying_Client('用户账号', '密码', '开发者账号')  # 用户中心>>软件ID 生成一个替换 96001
im = open('code_pic.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
result = chaojiying.PostPic(im, 9004)['pic_str']  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()all_list = []  # 存储被点击的坐标
if '|' in result:list1 = result.split('|')xy_list = []count1 = len(list1)for i in list1:x = int(list1[i].split(',')[0])xy_list.append(x)y = int(list1[i].split(',')[1])xy_list.append(y)all_list.append(xy_list)
else:xy_list = []x = int(result.split(',')[0])xy_list.append(x)y = int(result.split(',')[1])xy_list.append(y)all_list.append(xy_list)
print(all_list)
# 循环遍历点击图片
for i in all_list:x = i[0]y = i[1]action = ActionChains(driver).move_to_element_with_offset(code_img, x, y).click().perform()time.sleep(1)
driver.find_element_by_id('loginSub').click()

如果对您有帮助,记得点赞加关注,谢谢!!!

模拟登录12306(selenium+超级鹰)相关推荐

  1. selenium模拟登录拉勾(超级鹰)

    一.打开网页 url:https://www.lagou.com/ 二.关闭弹窗 三.点击登录 四.输入账号密码 五.勾选同意协议并登录 六.超级鹰验证码识别 七.判断是否登录成功与是否失败次数过多 ...

  2. python爬虫登录12306失败_Python网络爬虫(selenium模拟登录12306网站)

    一.通过selenium自动登录12306官网 1.1 超级鹰打码平台API,创建chaojiyin.py文件 #!/usr/bin/env python#coding:utf-8 importreq ...

  3. selenium模拟登录12306

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

  4. 用python模拟登录12306

    此内容仅供学习使用...杜绝XXX!!! 1.首先第一步 1.1进入12306的登录页面,并且打开开发者工具 在Netmork中找到验证图片的信息 1.2然后点击Headers后没有发现验证图片的UR ...

  5. selenium 超级鹰 通过携程滑块和汉字验证码

    大概流程 1.进入页面点击同意按钮. 2.得到滑块和滑块区域的xpath 3.定位滑块,设置按住事件,进行拖动 4.xpath定位汉字图片,获取屏幕截图,保存本地 5.超级鹰识别图片返回汉字对应的坐标 ...

  6. Python使用selenium模块模拟登录12306

    selenium模块概述 selenium模块是基于浏览器自动化的一个模块.换句话说使用selenium可以让浏览器根据自己写的代码自动运行. 相应的语法 ·编写基于浏览器自动化的操作代码 · 发起请 ...

  7. 模拟登录12306网站

    首先用火狐浏览器进入12306网站的登录界面,F12获取登录界面的url地址. 再获取验证码图片的链接及其验证码校正所post的数据 最后获取用户名和密码的登录链接及其post的数据 # coding ...

  8. python12306登录_python 手动验证并模拟登录12306

    [实例简介] [实例截图] 提示让输入验证码序号的时候(多个序号 以逗号隔开即可),就可以在同目录下打开图片验证码captcha.jpg,类似如下: [核心代码] import requests fr ...

  9. java 12306 模拟登陆_请教java尝试模拟登录12306时遇到的一个问题

    展开全部 首先12306网站前32313133353236313431303231363533e78988e69d8331333363386133缀为"https://" 表明是用 ...

最新文章

  1. 机器学习高阶认识(一): 机器学习假设与迁移学习
  2. 用ExayX在VS2019上输出文本有误的解决方案
  3. wxWidgets:使用事件
  4. P2387-[NOI2014]魔法森林【LCT】
  5. 编程软件python是什么意思_程序员Python编程必备5大工具,你用过几个?
  6. 连载二:Oracle迁移文章大全
  7. linux rdma服务,在Linux中infiniband rdma差转转bw
  8. js图片绘制框架 (折线图、柱状图、饼图、热力图) echarts
  9. 文件和目录权限/更改所有者和所属组/umask/隐藏权限lsattr/chattr
  10. linux下安装nginx1.10,Linux(RHEL7.0)下安装Nginx-1.10.2
  11. IntelliJ IDEA For Mac 的破解方法
  12. 基于模型驱动低代码平台的实现原理
  13. 无法直接复制文件到ubuntu虚拟机解决
  14. java快速开发项目_GitHub - Johnnyzhoutq/X-SpringBoot: X-SpringBoot是一个轻量级的Java快速开发平台,能快速开发项目并交付【接私活利器】...
  15. 区块链:从理论走向实践--高盛公司(Glodman Sachs)发布过的报告
  16. 一般常见电子邮箱都有哪几种?最常用的邮箱有哪些?
  17. PLC通讯实现-C#访问OpcUa实现读写PLC(十)
  18. 【办公软件有哪几种】万彩办公大师教程丨Office转图片工具
  19. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能
  20. mysql将没有员工的部门都删除_Mysql 用sql语句实现删除与CLARK同部门的员工信息...

热门文章

  1. 解决element的Table表格组件的高度问题( height只能是数字或者字符串 ),实现height: calc(100vh - 260px) 的效果
  2. 跨专业考研学生的三个问题
  3. js 实现在当前页面打开新窗口
  4. k3s证书过期的处理 以及 修改k3s证书有效期为10年(或自定义时间)
  5. 2021-12-22 AndroidR 电池信息 简单分析记录
  6. Jrebel、IDEA的激活与Springloaded使用
  7. 今日头条广告_API对接文档学习-1
  8. python爬取视频--下载2019巴菲特股东大会直播视频
  9. Webpack 使用
  10. windows7英文系统如何将电脑屏幕背景色改成保护眼睛的淡绿色