• py导出时段报表


    py导出时段报表
      昨天做的任务,一天下来各种杂事,白天也时不时摸鱼,搞到晚上回家继续弄。今早弄些细节基本算完成~~~
      这个脚本跟之前的最大区别,进去报表导出页面后,条件选择需要先点击下拉框,再选择地市或导出格式;另外一点,选择时间查询(前一天)的时候,先要抹掉默认值(用clear方法)再填入昨天的时间。
      因为正值上班时间,赶紧发完博,继续搬砖。。
    1、报表页面原来默认进去显示这样:

    现在需求:开始和结束时间选前一天日期的,地市选择“顺德”,点查看后再导出报表。

      1 # -*- coding: utf-8 -*- 
      2 # @Time : 2022/4/19 8:57
      3 # @Author : ljy 
      4 # @File : period-20220419.py
      5 #
      6 
      7 '''
      8    此脚本利用获取登陆系统的cookie,进去xx市销量页面,导出数据
      9 
     10 '''
     11 
     12 # coding:utf-8
     13 import os
     14 from requests_toolbelt.multipart.encoder import MultipartEncoder
     15 from selenium.webdriver.chrome.options import Options
     16 from selenium import webdriver
     17 from selenium.webdriver.common.action_chains import ActionChains
     18 import time
     19 import shutil
     20 import datetime
     21 import re
     22 import requests
     23 import json
     24 from tkinter import *
     25 import tkinter as tk
     26 import tkinter.messagebox
     27 
     28 from selenium.webdriver.support import expected_conditions as EC
     29 from selenium.webdriver.common.by import By
     30 from selenium.webdriver.support.wait import WebDriverWait
     31 from selenium.webdriver.common.keys import Keys
     32 import os
     33 import requests
     34 import sys
     35 import shutil
     36 
     37 
     38 #########################################################
     39 # 1、发送消息的函数
     40 def send_msg(msg):
     41     """
     42     :param msg: 要发送的消息
     43     :return: 200 or False
     44     """
     45     url = 'xxx'
     46     program = {"msgtype": "text", "text": {"content": msg}, "at": {"atMobiles": ['我的手机号'], "isAtAll": "false"}}
     47     headers = {'Content-Type': 'application/json'}
     48     try:
     49         f = requests.post(url, data=json.dumps(program), headers=headers)
     50     except Exception as e:
     51         return False
     52     return f.status_code
     53 
     54 
     55 #########################################################
     56 # 2、获取上个工作日时间
     57 def last_workday():
     58     for i in range(1, 7):
     59         now_time = datetime.datetime.now()
     60         yes_time = now_time + datetime.timedelta(days=-i)
     61         yes_time_week = yes_time.strftime('%Y-%m-%d')
     62         global last_workdays
     63         last_workdays = yes_time_week
     64         return last_workdays
     65 
     66 
     67 #########################################################
     68 # 3、 初始化浏览器
     69 def browser_page():
     70     path_get = 'E:\\table'
     71     print("当前路径: %s" % path_get)
     72     time.sleep(3)
     73     options = webdriver.ChromeOptions()
     74     prefs = {'download.default_directory': path_get,
     75              #  prefs = {'download.default_directory': 'E:\\table',
     76              'download.prompt_for_download': False,
     77              "download.directory_upgrade": False,
     78              "safebrowsing.enabled": False
     79              }
     80     options.add_experimental_option('prefs', prefs)
     81     try:
     82         global browser
     83         browser = webdriver.Chrome(r"chromedriver", chrome_options=options)
     84     except:
     85         print("browser faild!")
     86         send_msg("test: 浏览器初始化错误!")
     87         browser = webdriver.Chrome(r"chromedriver")
     88 
     89 ##################################################################
     90 # 4、登录主页
     91 def browser_project(browser):
     92     # 设置cookies前必须访问一次页面
     93     browser.get("某系统url")
     94     try:
     95         with open("cookies.txt", "r") as fp:
     96             cookies = json.load(fp)
     97             for cookie in cookies:
     98                 browser.add_cookie(cookie)
     99     except:
    100         print("获取cookie失败")
    101         send_msg("test: cookie已过期,获取cookie失败")
    102     # 拿cookie进去主页
    103     browser.get("某系统url")
    104 
    105 
    106 ##############################################################
    107 # 5、进入主页跳转
    108 def get_bo(browser):
    109     wait = WebDriverWait(browser, 10, 0.5)
    110     time.sleep(2)
    111     # 5.1 点击“某关键字”
    112     input_user = browser.find_elements_by_xpath(r'//*[@id="bodyer"]/div/div[2]/div/div[2]')
    113 
    114     try:
    115         input_user[0].click()
    116     except IndexError:
    117         send_msg("test:cookie文件失效,请重新执行!")
    118         tk.Tk().withdraw()
    119         tk.messagebox.showinfo("提示", "请先运行: 获取cookie脚本")
    120         browser.quit()
    121         # exit()
    122 
    123     time.sleep(5)
    124     browser.switch_to.window(browser.window_handles[1])
    125     # 5.2 选择“数据报表”
    126     input_user = browser.find_elements_by_xpath(r'//*[@id="mainNav"]/li[3]/a')
    127 
    128     time.sleep(5)
    129     input_user[0].click()

       ## 新增,该页面有时候很久才加载出来
        # 等到出现xxx元素
         element = WebDriverWait(browser, 20).until(
    EC.element_to_be_clickable((By.ID, "ctl00_ctl00_content_ContentPlaceHolder2_uc_report1_divReportContent")))
    time.sleep(2)
    130 
    131     # 5.3 选择“xxx时段报表”
    132     input_user = browser.find_elements_by_xpath(
    133         r'//*[@id="ctl00_ctl00_content_ContentPlaceHolder2_uc_report1_divReportContent"]/div[6]/ul/li[2]/p/a')
    134     time.sleep(2)
    135     input_user[0].click()
    136     browser.switch_to.window(browser.window_handles[2])
    137 
    138     ##################################################################
    139 
    140 # 6、xxxx报表页面,导出数据
    141 
    142     # 6.1 选择时间:
    143     # 报错
    144     # browser.find_element_by_id(r'//*[@id="reportViewer_ctl04_ctl03_txtValue"]').clear()
    145     # browser.find_elements_by_xpath(r'//*[@id="reportViewer_ctl04_ctl03_txtValue"]').clear()
    146 
    147     ## 6.1.1 左边日期框
    148     last_workdays = last_workday()
    149     print(last_workdays)
    150     time.sleep(20)
    151 
    152     browser.find_element_by_id("reportViewer_ctl04_ctl03_txtValue").clear()
    153     browser.find_element_by_id('reportViewer_ctl04_ctl03_txtValue').send_keys(last_workdays)
    154 
    155     ## 6.1.2 右边日期框
    156     time.sleep(2)
    157     browser.find_element_by_id("reportViewer_ctl04_ctl05_txtValue").clear()
    158     browser.find_element_by_id('reportViewer_ctl04_ctl05_txtValue').send_keys(last_workdays)
    159 
    160     # 6.2 选择地市:  ---- 如果选择所有地市,把6.2全部注释掉,貌似需求后来改成所有地市
    161     ## 6.2.1 先点下拉
    162     DownButton = browser.find_elements_by_xpath(r'//*[@id="reportViewer_ctl04_ctl07_ddDropDownButton"]')
    163     time.sleep(2)
    164     DownButton[0].click()
    165 
    166     ## 6.2.2 点“全选”
    167     QuanXuan = browser.find_elements_by_xpath(r'//*[@id="reportViewer_ctl04_ctl07_divDropDown_ctl00"]')
    168     time.sleep(2)
    169     QuanXuan[0].click()
    170 
    171     ## 6.2.3 点“顺德”
    172     ShunDe = browser.find_elements_by_xpath(r'//*[@id="reportViewer_ctl04_ctl07_divDropDown_ctl23"]')
    173     time.sleep(2)
    174     ShunDe[0].click()
    175 
    176     # 6.3 点击“查看报表”
    177     time.sleep(5)
    178     input_user = browser.find_elements_by_xpath(r'//*[@id="reportViewer_ctl04_ctl00"]')
    179     input_user[0].click()
    180 
    181     time.sleep(10)
    182     ## 6.3.1 先点下拉
    183     buttonLink = browser.find_element_by_xpath(r'//*[@id="reportViewer_ctl06_ctl04_ctl00_ButtonLink"]')
    184     time.sleep(2)
    185     buttonLink.click()
    186 
    187     ## 6.3.2 导出为excel
    188     menu = browser.find_elements_by_xpath(r'//*[@id="reportViewer_ctl06_ctl04_ctl00_Menu"]/div[5]/a')
    189     time.sleep(2)
    190     menu[0].click()
    191 
    192     # 6.4 报表改名
    193     path_get = os.getcwd()
    194     filepath2 = change_name(path_get, "period tb")
    195 
    196     browser.quit()
    197     print("exit")
    198 
    199 ###########################
    200 # 7、 修改导出报表的名字
    201 def change_name(url, add):
    202     url = 'E:\\table'
    203     print("改名,当前路径: %s" % url)
    204     time.sleep(3)
    205     print(r"RF_0202%s" % last_workdays)
    206     patt = re.compile(r"RF_0202")
    207     lists = os.listdir(url)
    208     print(lists)
    209     while True:
    210         lists.sort(key=lambda fn: os.path.getmtime(url + '\\' + fn))
    211         filepath = os.path.join(url, lists[-1])
    212         try:
    213             context = patt.search(filepath).group()
    214             if context:
    215                 break
    216         except:
    217             try:
    218                 lists.pop()
    219             except:
    220                 send_msg("test: %s -- 报表导出失败,没有文件!" % add)
    221     # ok
    222     filepath2 = url + "\\" + add + "-" + last_workdays.replace("-", "") + ".xls"
    223 
    224     print(filepath2)
    225     time.sleep(5)
    226 
    227     shutil.move(filepath, filepath2)
    228     return filepath2
    229 #
    230 #
    231 # ###################### 导入报表 
    232   后续等公司开发弄完再做。。。
    233 
    234 #################################################################
    235 def start_project_bo():
    236   #  last_workday()
    237     browser_page()
    238     browser_project(browser)
    239     get_bo(browser)
    240 
    241 if __name__ == '__main__':
    242     start_project_bo()

      大家主要看 “6、XX时段报表页面,导出数据”,前面都是各种页面跳转到报表页面。

      这个模板,以后可以继续参考用。

    2、成果图:

     运行脚本,自动选好查询条件,查看报表后,最后导出:先下拉,再选 Excel 格式下载

     

      公司前端后来发了这个给我看,鼠标定位的:https://m.yisu.com/zixun/174401.html

      说爬虫用这种方法实现,比较简单,毕竟xpath定位元素容易报错。

  • 相关阅读:
    jqGrid api 中文说明
    jsp + js + 前端弹出框
    js中关于带数字类型参数传参丢失首位数字0问题
    java中WGS84坐标(ios)转换BD-09坐标(百度坐标)
    Java中的“浅复制”与“深复制”
    Git错误:error:failed to push some refs to 'git@gitee.com:name/project.git'
    git操作教程
    线程调度及进程调度
    同步锁Lock
    多线程案例
  • 原文地址:https://www.cnblogs.com/windysai/p/16168581.html
Copyright © 2020-2023  润新知