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的Zato发送AMQP消息的教程
Apr 16 Python
Python中文竖排显示的方法
Jul 28 Python
基于python实现微信模板消息
Dec 21 Python
Python装饰器实现几类验证功能做法实例
May 18 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
Python selenium抓取微博内容的示例代码
May 17 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
详解Python绘图Turtle库
Oct 12 Python
Python实现弹球小游戏
Aug 01 Python
详解python 内存优化
Aug 17 Python
Prometheus开发中间件Exporter过程详解
Nov 30 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
python文件操作整理汇总
2014/10/21 Python
提升Python程序运行效率的6个方法
2015/03/31 Python
解读! Python在人工智能中的作用
2017/11/14 Python
Django自定义manage命令实例代码
2018/02/11 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
python实现停车管理系统
2018/11/30 Python
numpy.where() 用法详解
2019/05/27 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
教育学习自我评价
2014/02/03 职场文书
高一数学教学反思
2014/02/07 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
关爱空巢老人感想
2015/08/11 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书