模拟登录12306

结构

1.访问首页,将浏览器窗口最大化
2.找到并点击账号登录,截取全局图片,获得验证码位置坐标,通过该坐标从全局图片里截取验证码图片
3.调用识别平台,返回结果
4.拆分坐标,找到对应位置并选中
5.填入账号密码,立即登录

实现

from selenium import webdriver
from time import sleep
from PIL import Image   # 截图
from chaojiying import Chaojiying_Client
from selenium.webdriver import ActionChainswc = webdriver.Chrome()
wc.implicitly_wait(10)try:wc.get('https://kyfw.12306.cn/otn/resources/login.html')# 窗口最大化wc.maximize_window()# 点击账号登录act_btn = wc.find_element_by_partial_link_text('账号登录')act_btn.click()sleep(2)# 截图wc.save_screenshot('./main.png')# 验证码位置sleep(2)img_y = wc.find_element_by_id('J-loginImg')sleep(2)print('size:',img_y.size)print('location:',img_y.location)size = img_y.sizelocation = img_y.location# 验证码图片位置坐标# Mac分辨率放大,*2后获得准确位置img_location = (int(location['x'] *2),int(location['y']*2),int(location['x'] *2 + size['width']*2),int(location['y'] *2 + size['height']*2))print(img_location)# 打开截取的大图i = Image.open('./main.png')code_img_name = './code.png'# 捕捉验证码坐标部分frame = i.crop(img_location)# 存图frame.save(code_img_name)chaojiying = Chaojiying_Client('username', 'password', 'id')  # 用户中心>>软件ID 生成一个替换 96001im = open('code.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpgres =chaojiying.PostPic(im, 9004)print('res:',res)result = res['pic_str']print('result:',result)all_list = []if '|' in result:list_1 = result.split('|')count_1 = len(list_1)for i in range(count_1):xy_list = []x = int(list_1[i].split(',')[0])y = int(list_1[i].split(',')[1])xy_list.append(x)xy_list.append(y)all_list.append(xy_list)else:x = int(result.split(',')[0])y = int(result.split(',')[1])xy_list = []xy_list.append(x)xy_list.append(y)all_list.append(xy_list)print(all_list)for a in all_list:x = a[0]y = a[1]print('x,y:',x,y)ActionChains(wc).move_to_element_with_offset(img_y,x,y).click().perform()sleep(1)username = wc.find_element_by_id('J-userName')username.send_keys('username')password = wc.find_element_by_id('J-password')password.send_keys('password')sleep(3)submit = wc.find_element_by_id('J-login')submit.click()sleep(10)except Exception as e:print(e)finally:wc.quit()

问题及解决

1.screenshot does not match file type. It should end with a .png
在截图时先用了save_screenshot('./main.jpg')结果报错,把存储格式改为png就行

2.截图偏差
在截取验证码部分时尝试了很多次都没有截到验证码正确的部分,第一反应是验证码坐标定位错误,使用xpath、CSS、id都定位了还是J-loginImg
查了很久之后发现可能是跟屏幕分辨率有关系,Mac - 显示器 - 屏幕,可以选缩放,我还是保持显示器默认,就在代码里改。
根据截图位置(这一部分图片没保存……)和验证码位置推算,尝试添加倍数,应该是在长宽的基础上都*2。

3.点击验证码出错,一个是超级鹰返回的验证码坐标重复,一个是只能定位到最后一个坐标,一个是click()点击失效
尝试在x,y坐标上*2,将移动元素修改为坐标位置,开始报错move target out of boundsmove_to requires a WebElement
可能是没有更换cookie和UA的原因,验证太多次12306也开始报错
最后修改为原代码,反复测试后可行 (……………………)

Mac 模拟登陆12306相关推荐

  1. 使用Python模拟登陆12306并全自动下单

    最近一段时间一直在研究用Python模拟登陆12306网站并自动刷票下单,经过一段时间的摸索,终于完成了代码,实现了12306刷票的功能.话不多说,先给大伙儿看看成果.我录制了一段时间,展示了自动刷票 ...

  2. Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

    登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://kyfw.12306.cn/otn/resources/login.html 实现目标:模拟登陆中国铁路12306,攻 ...

  3. php selenium模拟登陆,12306 的selenium实现模拟登陆

    # 下面是12306 实现的模拟登陆 # 解码 应用超级鹰,注册用户,左侧栏软件ID进去,开启一个新软件,拿到软件ID # 下面测试都在jupyter里面实现 # 超级鹰类 cell import r ...

  4. 以selenium模拟登陆12306

    初级模拟,速度有点慢,后期有时间再优化 1 # -*- coding:utf-8 -*- 2 # author:zxy 3 # date:2018-12-23 4 5 from selenium im ...

  5. 模拟登陆 12306网站

    准备目标网站 :https://kyfw.12306.cn/otn/login/init安装PIL模块: pip3 install pillow 或 pip3 --default-timeout=10 ...

  6. 模拟登陆 - 破解12306验证码

    12306模拟登陆demo: 用selenium来进行模拟登陆操作,主要是这个验证码部分. https://kyfw.12306.cn/otn/resources/login.html 这个验证码解决 ...

  7. 12306模拟登陆Python3.x+cookiejar+request

    代码传到GitHub上了链接 https://github.com/MrYHM/python-12306 这里就不展示了,只讲一讲思路. 1.cookie的处理 其实urllib在open函数内部创建 ...

  8. Scrapy 模拟登陆知乎--抓取热点话题

    工具准备 在开始之前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 若是你有使用 postman 那就更好了. Python 1 scrapy genspider zhihu 使用以 ...

  9. python模拟登陆 验证码el_python 模拟登陆github的示例

    # -*- coding: utf-8 -*- # @Author: CriseLYJ # @Date: 2020-08-14 12:13:11 import re import requests c ...

最新文章

  1. Simple Dynamic Strings(SDS)源码解析和使用说明一
  2. 【Android】ViewPager实现无限循环滚动
  3. LeetCode: 344. Reverse String
  4. Cacti(一)之“better-cacti-templates”
  5. debian下安装LNMP(三)
  6. 深入浅出python机器学习_9.1.5_通过数据预处理提高模型的准确率_MinMaxScaler
  7. JavaWeb-综合案例(用户信息)-学习笔记04【删除选中功能】
  8. codeforces gym100959 I - Robots(稠密图建图优化)
  9. db2 sql 判断select是否为空_学会复杂一点的SQL语句:Oracle DDL和DML
  10. Notice: Undefined offset 的解决方法
  11. 计算机组成原理fpga实验指导书,计算机组成原理 FPGA实验指导书.doc
  12. java迭代遍历_JAVA集合中的迭代器的遍历
  13. 查看GCC编译优化的具体选项开关
  14. 计算机二级vfp程序语言,2012年计算机二级VFP语言基础学习教程
  15. WEB安全之代码安全----ESAPI
  16. 用python写生日快乐说说_生日快乐的说说(精选50句)
  17. 乘幂法求主特征值和特征向量(C++)
  18. 基于树莓派语音控制—LED开关控制
  19. 0ctf-2017-pwn-char 题解
  20. Proteus仿真-51单片机最小系统点亮LED

热门文章

  1. Web前端开发精品课HTML CSS JavaScript基础教程CSS部分知识点总结
  2. 雷达人体感应技术,雷达感应模组方案
  3. 个性化EDM数据营销的三大提醒
  4. 【Flask学习记录】
  5. 高中数学函数解题方法:函数的单调性与最值(高考题)
  6. 如何研究透一家公司:此文烂熟于心,将终生受益
  7. 农业面源污染治理项目监测平台
  8. 绿地五里桥 设计原型_世博十年,满满回忆!一张地图回顾五里桥地区十年变迁!...
  9. python3操作xls,xlsx文件方法汇总
  10. 一文掌握如何轻松稿定项目风险管理【静说】