前言:公司内部oa和取数系统很渣,为了安全性不支持mysql链接,也不支持chrome,所以selenium不能用,必须每天手动取数。之前接触了PyMouse和PyKeyboard,想试下是否可以完成自动化取数。初步实现了,但是还存在很多问题,主要如下:
1、对于网络速度有要求,如果在等待时间内下一个网页无法弹出来(或者某个取数时间比较长不出来),就会导致后续步骤全部出错;
2、不同电脑的显示模式不同,有可能坐标轴都需要变动;

# coding=utf-8
from pymouse import PyMouse
from pykeyboard import PyKeyboard
import os
import time
from datetime import datetime
import win32clipboard
import win32con
import getpass
import tracebackdef click_and_sleep(h, v, seconds):'''点击并暂停'''m.click(h, v)time.sleep(seconds)def alt_table():'''alt_table切换页面'''k.press_key(k.alt_key)time.sleep(1)k.tap_key(k.tab_key)time.sleep(1)k.release_key(k.alt_key)def get_this_month():'''获得月份'''this_day = datetime.now().strftime("%d")month = int(datetime.now().strftime("%m"))if this_day == "01": return str(month - 1) + '月'else: return str(month) + '月'def copy_and_paste(value):'''把值复制黏贴'''win32clipboard.OpenClipboard()win32clipboard.EmptyClipboard()win32clipboard.SetClipboardText(value, win32clipboard.CF_UNICODETEXT)win32clipboard.CloseClipboard()time.sleep(1)k.press_keys([k.control_key, 'v'])  # 黏贴def get_drag_value(start_coordinate, end_coordinate):'''获取鼠标圈中的内容'''m.move(start_coordinate[0], start_coordinate[1])m.drag(end_coordinate[0], end_coordinate[1])time.sleep(1)k.press_keys([k.control_key, 'c'])  # 复制win32clipboard.OpenClipboard()value = win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT)win32clipboard.CloseClipboard()return valuedef download(key, value):'''下载文件'''search(key)try:answer = get_drag_value((1131, 376), (895, 376))except:answer = keyfinally:if answer == key: #判断取数目的和key是否一致click_and_sleep(1556, 369, 5)  # 点击“下载”click_and_sleep(1022, 545, 1)  # 点击“保存”# 注:这里产生的下载框可能会和系统有关(和是否装了迅雷等也有关),我这里使用的是win7默认自带的下载器,且把窗口拉大到全屏if 'CDMA' in key:  # 第一次有可能下载的地址不对,需要切换,第二次开始就正常了m.click(1127, 44)  # 选择地址栏k.tap_key(k.backspace_key)  # 删除之前的地址copy_and_paste(path_data)  # 输入数据文件夹的路径click_and_sleep(1690, 42, 1)  # 切换路径m.click(1614, 929)  # 点击“文件名”栏copy_and_paste(value)time.sleep(1)click_and_sleep(1756, 1000, 1)  # 点击“保存”click_and_sleep(1022, 537, 3)  # 点击“替换”——>“是”click_and_sleep(1120, 586, 1)  # 点击“关闭”else:k.tap_key(k.function_keys[5])  # 按F5刷新login_idap()download(key ,value)def get_FileModifyTime(filePath):'''获取文件修改时间,以"12-26"形式展示'''t = os.path.getmtime(filePath)timeStruct = time.localtime(t)return time.strftime('%m-%d', timeStruct)def get_FileSize(filePath):'''获取文件大小,单位是根据文件大小变化;获得的结果是一个元组,第一个元素是不带单位的数字(内在单位是B),第二个是带单位的数字(比如1.20KB)'''fsize1 = os.path.getsize(filePath)if fsize1 >= 1024*1024: fsize2 = str(float('%.2f' % (fsize1/(1024 * 1024)))) + 'MB'elif fsize1 >= 1024: fsize2 = str(float('%.2f' % (fsize1/1024))) + 'KB'else: fsize2 = str(fsize1) + '.00' + 'B'return fsize1, fsize2def get_OldFileSize():'''获得文件更新前的大小(单位B)'''old_file_size = {}for value in list_dict.values():filepath = path_data + valueold_file_size[value] = get_FileSize(filepath)[0]return old_file_sizedef get_OldFileSize2():'''获得文件更新前的大小(单位根据大小变动)'''old_file_size = {}for value in list_dict.values():filepath = path_data + valueold_file_size[value] = get_FileSize(filepath)[1]return old_file_sizedef file_check(value):'''检查文件是否下载更新了,更新了返回1,日期更新但大小没变返回2,日期更新但大小变小了返回3,日期没更新返回4'''this_time = datetime.now().strftime("%m-%d")filepath = path_data + valueif get_FileModifyTime(filepath) == this_time:if get_FileSize(filepath)[0] > old_file_size[value]:print('>>>{}已经更新了!'.format(value))return 1elif get_FileSize(filepath)[0] == old_file_size[value]:print('>>>{}日期更新了,但是大小没变,请注意!'.format(value))return 2else:print('>>>{}日期更新但大小变小了,请注意!'.format(value))return 3else:print('>>>{}日期不对,请注意!'.format(value))return 4def redownload(key, value, sleep):'''重新下载'''print('>>>{}秒后准备重新取数!'.format(sleep))time.sleep(sleep)download(key, value)answer = file_check(value)print(answer)if (answer == 1) or (answer ==2):print('>>>貌似正常了!')return 1else:print('>>>我已经尽力了,{}还是有问题'.format(value))return 2def search(key):'''根据key在搜索栏里搜索'''m.click(1118, 267)  # 点击“取数目的”k.tap_key(k.backspace_key, n=10)  # 删除之前的搜索内容copy_and_paste(key)time.sleep(3)click_and_sleep(1877, 229, 3)  # 点击“查询”def access(key):'''取数复用'''try:answer = get_drag_value((1131, 376), (895, 376))except:answer = keyfinally:if answer == key:click_and_sleep(1742, 370, 3)  # 点击“取数复用”for i in range(5):click_and_sleep(1867, 230, 3)  # 点击“下一步”click_and_sleep(1867, 230, 5)  # 点击“立即取数”else:k.tap_key(k.function_keys[5])  # 按F5刷新login_idap()search(key)access(key)def login_oa():'''第一步:登陆oa'''name = getpass.getuser()  # 获取当前系统的用户名os.startfile('C:\\Users\\' + name + r'\AppData\Local\360Chrome\Chrome\Application\360chrome.exe')time.sleep(1)click_and_sleep(1112, 49, 1) #点击地址栏k.type_string('www.sh.ctc.com') #输入网址k.tap_key(k.enter_key) #输入回车time.sleep(3)click_and_sleep(920, 259, 1) #点击“动态码认证”click_and_sleep(984, 380, 1) #点击“用户名栏”k.tap_key(k.backspace_key, n=10)time.sleep(1)k.type_string('zhanglei1') #输入用户名time.sleep(1)k.tap_key(k.tab_key) #按table到密码框# m.click(889, 438) #点击密码框k.type_string('******') #输入密码m.click(1098, 495) #点击获取动态码dynamic_code = input('请输入动态码:')alt_table() #alt+table切换到浏览器页面time.sleep(1)m.click(910, 502)  # 点击动态码框copy_and_paste(dynamic_code) #输入动态码click_and_sleep(956, 556, 3) #点击“登陆”按钮def login_idap():'''第二步:打开idap'''click_and_sleep(765, 183, 3) #点击“我的工作”click_and_sleep(637, 875, 3) #点击“IDAP智能取数平台”click_and_sleep(140, 273, 3) #点击“取数管理”click_and_sleep(71, 298, 3) #点击“我的取数”def search_and_access():'''第三步:搜索并取数'''for key in list_dict.keys():search(key)access(key)def search_and_download():'''第四步:搜索并下载'''for key, value in list_dict.items():download(key, value)def download_check():'''第五步:判断下载的文件是否准确,如果不对的话重新下载(主要是针对单转融这类时间比较长的)'''for key, value in list_dict.items():answer = file_check(value)if (answer == 1) or (answer ==2):continueelif answer == 3:redownload(key, value, 5)continueelif answer == 4:answer = redownload(key, value, 200)if answer == 1:continueelif answer == 2:redownload(key, value, 200)continueif __name__ == "__main__":m = PyMouse()k = PyKeyboard() ## print(m.position())path_data = os.path.abspath('..') + "\\数据\\"orgin_dict = {'CDMA': 'cdma.xls', '宽带': 'kd.xls', '199+30': '199+30.xls', '精品智能组网': '精品智能组网.xls', '4K': '4k.xls', '单转融': '单转融.xls'}list_dict = {}for key, value in orgin_dict.items():new_key = key + ' ' + get_this_month()list_dict[new_key] = valueold_file_size = get_OldFileSize()print(get_OldFileSize2())try:login_oa()login_idap()search_and_access()print('>>>数据复用完毕!')time.sleep(30) #这个根据最大取数时间来定,比如单转融1000秒都未必能好>_<search_and_download()print('>>>数据下载完毕!')download_check()except:traceback.print_exc()finally:a = input('>>>取数完毕,按回车键退出!')

Python:初步完成IE浏览器的查询、点击和文件下载相关推荐

  1. python批量请求url_使用Python Requests伪装成浏览器请求百度360获取关键词批量排名...

    使用Python Requests伪装成浏览器请求百度360获取关键词批量排名 #!/usr/local/python/bin/python3.7 import requests,re,time,ra ...

  2. Python使用mechanize模拟浏览器

    Python使用mechanize模拟浏览器 之前我使用自带的urllib2模拟浏览器去进行访问网页等操作,很多网站都会出错误,还会返回乱码,之后使用了 mechanize模拟浏览器,这些情况都没出现 ...

  3. chrome动态ip python_简单python代码实现模拟浏览器操作

    首先安装python环境,楼主为python3.6.6 用pip 安装selenium pip install selenium 下面是代码的具体实现: #交互模式 from selenium imp ...

  4. python使用pandas基于时间条件查询多个oracle数据表

    python使用pandas基于时间条件查询多个oracle数据表 目录 python使用pandas基于时间条件查询多个orcale数据表 #orcale数据连接

  5. python连接MySQL并进行数据查询

    python连接MySQL并进行数据查询 #建立数据库的连接 mydb = mysql.connector.connect(host="0.0.0.0",user="ro ...

  6. python获取数据库列名_python sqlite3 查询操作及获取对应查询结果的列名

    记录查询操作及获取查询结果列字段的方法 1.sqlite3 中获取所有表名及各表字段名的操作方法 SQLite 数据库中有一个特殊的表叫 sqlite_master,sqlite_master 的结构 ...

  7. 从入门到入土:机器学习part02|python|初步学习|numpy|Matplotlib

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  8. Python实现圆通快递单号查询官方接口教程

    此系列为代码语言与各大常用快递公司的接口教程,供各位程序员学习参考,后续我将会继续分享各语言的快递单号查询接口教程,敬请关注. 下面我们来说下具体操作过程,如何用Python实现圆通快递单号查询. 一 ...

  9. python编写程序解方程_第2章 Python初步 课后题

    [单选题]建设中国特色社会主义,把我国建设成为富强.民主.文明.和谐.美丽的社会主义现代化强国,是我国各族人民的( ) [简答题]案例系统的测试报告,提交时间为9月28日,上午九点之前 [单选题]一份 ...

最新文章

  1. 使用Scala-IDE构建Maven项目
  2. POJ 3268 迪杰斯特拉图论 置换找最短路
  3. 如何配置Microsoft LoopBack Adapter 配置为系统的主网络适配器
  4. Flash,EEPROM区别
  5. LeetCode 29 两数相除
  6. VC#2005 Starter Kit: Screen Saver 使用介绍
  7. android多媒体编程题库,android 仿猿题库答题UI
  8. work php高性能,RabbitMQ之工作(Work)模式(PHP版)-Go语言中文社区
  9. 收藏 | Redis 超详细总结笔记总
  10. 和哪个专业的男生谈恋爱最惨?
  11. linux 自动安装 yum,LINUX6安装YUM仓库和实现开机自动挂载
  12. 安装openCV到VS2010,Win764位机时遇到的问题的解决办法
  13. 【Hadoop】HIVE 数据表 使用
  14. 【configure】如何用automake、autoconf指令生成configure并创建自己的linux tar.gz安装包【初级篇:简单建立-测试】
  15. ISE中UCF约束文件的编写
  16. neo4j python
  17. 朴素贝叶斯(naive Bayes)原理与应用
  18. 盛大如何再次“盛大”
  19. 使用canvas绘制数字雨
  20. 23 种设计模式的通俗解释,虽然有点污,但是秒懂

热门文章

  1. 快速入门linux基本操作大全
  2. 芭蕉芋淀粉加工设备和薯类机械的区别
  3. 计算机机房的维护管理论文,计算机机房维护与管理论文.doc
  4. struts 2 国际化乱码问题解决方案
  5. 数据库难还是学java难,mysql数据库比java难吗,女生学数据库难吗
  6. 支付清算体系介绍-上
  7. 用html5颜色自动渐变,HTML5渐变背景色生成器
  8. 案例:5分钟自动跳转页面 监听单击事件 倒计时跳转
  9. WORKNC 2022.1.2228_2022.10.30(免安装)
  10. 安卓入门-动画(Animation)(由简单的单一动画到复杂的时间顺序叠加动画)(XML实现方式+JAVA实现方式)