基于DrissionPage的数据获取和工作时长计算

基于DrissionPage的数据获取和工作时长计算

背景

近期有了解DrissionPage相关内容,并基于公司计算奋斗值的要求下,编辑一版自用的奋斗值计算流程。

代码

初版代码,有一些冗余的变量和逻辑没有删除

from DrissionPage import ChromiumPage
import datetime
import calendar
import chinese_calendar as cc
import time

startTime = time.time()
today = datetime.date.today()
year = today.year
month = today.month
_, daysInMonth = calendar.monthrange(year, month)
timeSortList = []
firstDay = datetime.datetime(year, month, 1)
lastDay = firstDay + datetime.timedelta(days=daysInMonth - 1)

userName = input("请输入用户名:")
userPassword = input("请输入密码:")
page = ChromiumPage()
page.get('website')

page.ele('xpath:/html/body/div[2]/div/div[2]/div[2]/ul/li[3]/div/input[1]').input(userName)
page.ele('xpath:/html/body/div[2]/div/div[2]/div[2]/ul/li[4]/input').input(userPassword)

page.ele('xpath:/html/body/div[2]/div/div[2]/div[2]/div[1]/input').click()
page.wait.eles_loaded('xpath:/html/body/div[4]/div/div[1]/div[2]/div[2]/div/div[2]/div/div[5]/a/div')
page.ele('xpath:/html/body/div[4]/div/div[1]/div[2]/div[2]/div/div[2]/div/div[4]/a/div').click()
page.wait(1)

# 获取打卡数据
tbodyAll = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[3]/table/tbody')
goToWorkTime, goOffWorkTime = '', ''
timeFormat = "%H:%M"
workTime = []
timeList = tbodyAll.texts()

# 获取公出数据
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/ul/li[4]/a').click()
page.wait(0.8)
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[1]/div/div[1]/div/span[10]/span/span[2]').click()
page.wait(0.8)
page.ele('xpath:/html/body/div[13]/div/div[2]/ul/li[3]/span').click()
tbody = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[4]/div/div[3]/table/tbody')

businessTrip = []
for i in range(len(tbody.texts())):
    temp = tbody.texts()[i].split('\t')
    if temp[2] == '本地公出':
        timeSortList.append(temp[3])
        timeSortList.append(temp[4])
    elif temp[2] == '国内出差(给差补)':
        if datetime.datetime.strptime(temp[3][:10], '%Y-%m-%d') <= firstDay:
            businessTrip.append(datetime.datetime(year, month, 1, 8, 30).strftime('%Y-%m-%d %H:%M'))
        else:
            businessTrip.append(temp[3])

        if datetime.datetime.strptime(temp[4][:10], '%Y-%m-%d') >= lastDay:
            businessTrip.append(datetime.datetime(year, month, daysInMonth, 17, 30).strftime('%Y-%m-%d %H:%M'))
        else:
            businessTrip.append(temp[4])
# print(businessTrip)
page.wait(1)

# 获取加班数据
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/ul/li[7]/a').click()
page.wait(0.8)
tbody = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[7]/div/div[3]/table/tbody')

for i in range(len(tbody.texts())):
    temp = tbody.texts()[i].split('\t')
    timeSortList.append(temp[5])
    timeSortList.append(temp[6])

# 获取请假数据
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/ul/li[2]/a').click()
page.wait(0.8)
tbody = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[2]/div/div[3]/table/tbody')

holidayInt = 0
holidayList = []
for i in range(len(tbody.texts())):
    temp = tbody.texts()[i].split('\t')
    if temp[3] == '年假':
        holidayInt += 1
    elif temp[3] == '事假' or temp[3] == '调休':
        holidayList.append(temp[6])
        if '8:30' in temp[4]:
            timeSortList.append(temp[4])
        if '17:30' in temp[5]:
            timeSortList.append(temp[5])

for i in range(len(timeList)):
    timeSortList.append(timeList[i].split('\t')[12])
    
page.ele('xpath:/html/body/div[3]/div/div/div[4]/div/ul/li[9]/a').hover()
page.wait(0.5)
page.ele('xpath:/html/body/div[3]/div/div/div[4]/div/ul/li[9]/ul/li[2]/a[5]').click()
page.wait(0.8)
page.ele('xpath:/html/body/div[19]/div[2]/div/input[1]').click()
page.quit()

def CompareTime(list):
    return sorted(list, key=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M'))

timeSortList = list(set(timeSortList))
timeSortList = CompareTime(timeSortList)

tempFormat = '%Y-%m-%d'
for i in range(0, len(businessTrip), 2):
    tempList = []
    for j in range(len(timeSortList)):
        if datetime.datetime.strptime(businessTrip[i][:10], tempFormat) <= datetime.datetime.strptime(timeSortList[j][:10], tempFormat) <= datetime.datetime.strptime(businessTrip[i + 1][:10], tempFormat):
            tempList.append(timeSortList[j])

    for j in range(len(tempList)):
        timeSortList.remove(tempList[j])

for j in range(daysInMonth):
    dayOfMonth = datetime.date(year, month, j + 1)
    if dayOfMonth == datetime.date.today():
        break
    for i in range(len(timeSortList)):
        temp = timeSortList[i]
        # print(temp)
        _, week, weekday = dayOfMonth.isocalendar()
        if str(dayOfMonth) in temp:
            if goToWorkTime == '':
                goToWorkTime = temp[11:]
            elif goToWorkTime != '' and goOffWorkTime == '':
                goOffWorkTime = temp[11:]
            elif goToWorkTime != '' and goOffWorkTime != '':
                if datetime.datetime.strptime(goOffWorkTime, timeFormat) < datetime.datetime.strptime(temp[11:], timeFormat):
                    goOffWorkTime = temp[11:]
            if i == len(timeSortList) - 1:
                if goToWorkTime == '' or goOffWorkTime == '':
                    goToWorkTime, goOffWorkTime = '', ''
                    break
                seconds = (datetime.datetime.strptime(goOffWorkTime, timeFormat) - datetime.datetime.strptime(goToWorkTime, timeFormat)).total_seconds()
                if cc.is_workday(dayOfMonth):
                    if seconds < 32400:
                        goToWorkTime, goOffWorkTime = '', ''
                        timeSortList = timeSortList[i:]
                        break
                    seconds -= 32400
                workTime.append(round(seconds / 3600, 2))
                timeSortList = timeSortList[i:]
                goToWorkTime, goOffWorkTime = '', ''
                break
        else:
            if datetime.datetime.strptime(temp[0:10], '%Y-%m-%d').date() < dayOfMonth:
                continue
            else:
                if goToWorkTime == '' or goOffWorkTime == '':
                    goToWorkTime, goOffWorkTime = '', ''
                    break
                seconds = (datetime.datetime.strptime(goOffWorkTime, timeFormat) - datetime.datetime.strptime(goToWorkTime, timeFormat)).total_seconds()
                if cc.is_workday(dayOfMonth):
                    if seconds < 32400:
                        goToWorkTime, goOffWorkTime = '', ''
                        timeSortList = timeSortList[i:]
                        break
                    seconds -= 32400
                workTime.append(round(seconds / 3600, 2))
                timeSortList = timeSortList[i:]
                goToWorkTime, goOffWorkTime = '', ''
                break

timeFormat = "%Y-%m-%d %H:%M"
for i in range(0, len(businessTrip), 2):
    seconds = (datetime.datetime.strptime(businessTrip[i + 1], timeFormat) - datetime.datetime.strptime(businessTrip[i], timeFormat)).total_seconds()
    seconds -= 9 * 3600
    count = int((round(seconds / 3600, 2)) / 24)
    if count == 0 and not (cc.is_workday(datetime.datetime.strptime(businessTrip[i][:10], tempFormat))):
        workTime.append(8)
    elif count != 0:
        for m in range((datetime.datetime.strptime(businessTrip[i + 1][:10], tempFormat) - datetime.datetime.strptime(businessTrip[i][:10], tempFormat)).days + 1):
            if not cc.is_workday(datetime.datetime.strptime(businessTrip[i][:10], tempFormat) + datetime.timedelta(days=m)):
                workTime.append(8)
    workTime.append(1.6 * (count + 1))
print(workTime)
print(round(sum(workTime) - sum(float(item) for item in holidayList), 2))
endTime = time.time()
print(f"流程耗费的时间:{round((endTime - startTime), 2)} 秒")

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值