selenium+超级鹰实现模拟登录12306


Posted in Python onJanuary 24, 2021

最近迷上了用selenium去登陆各大网站,别说selenium真挺好用,可以轻松搞定ajax动态加载的网页,不用很费劲的去抓包查找。咳咳…跑题了,回归正题。

这次用selenium去登录12306网站,听说比较困难。我就去试了试,发现它的验证码实在是那啥…就是这样的。听头疼的。

selenium+超级鹰实现模拟登录12306

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

过程:

用我们的开发者工具定位到输入账号和密码的窗口,找到并send_keys

driver.find_element_by_id('username').send_keys('用户名')
time.sleep(0.5)
driver.find_element_by_id('password').send_keys('密码')

然后复杂的过程就来了。我们想要得到验证码的图片。但是头疼的是,图片是再变化的。我们请求一次,就变化一次,不像其他普通网站一样不会变化,直接保存图片就行了。但是这是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('验证码图片保存成功!!')

我们识别验证码用的是超级鹰,具体如何使用可以去查一查。验证码有可能需要我们点击多个,所以通过打码平台会得到多个坐标,就比如这种。有两个日历,需要点击两次,通过超级鹰就会得到两个坐标。如下图。我们发现有两个坐标会有一个“|”,有三个坐标就有两个“|”,所以我们就把他们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)

selenium+超级鹰实现模拟登录12306

selenium+超级鹰实现模拟登录12306

最后嘛,我们得到了验证码的坐标,当然就去点击啦。但是,这个坐标是相对于验证码的图片的坐标,我们必须用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-8

import requests
from hashlib import md5


class Chaojiying_Client(object):

  def __init__(self, username, password, soft_id):
    self.username = username
    password = password.encode('utf8')
    self.password = md5(password).hexdigest()
    self.soft_id = soft_id
    self.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()

到此这篇关于selenium+超级鹰实现模拟登录12306的文章就介绍到这了,更多相关selenium 模拟登录12306内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的并发处理之asyncio包使用的详解
Apr 03 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
python中update的基本使用方法详解
Jul 17 Python
docker-py 用Python调用Docker接口的方法
Aug 30 Python
python 实现return返回多个值
Nov 19 Python
python 创建一维的0向量实例
Dec 02 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
python实现简单遗传算法
Sep 18 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 #Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 #Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 #Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 #Python
python 图像增强算法实现详解
Jan 24 #Python
详解用 python-docx 创建浮动图片
Jan 24 #Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 #Python
You might like
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
采用call方式实现js继承
2014/05/20 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
JavaScript实现Excel表格效果
2020/02/07 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
庆祝教师节标语
2014/10/09 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书