您现在的位置是:首页 >学无止境 >爬虫小项目-worktime网站首页学无止境
爬虫小项目-worktime
简介爬虫小项目-worktime
test.py
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtGui import QIcon, QPalette, QBrush, QColor, QIntValidator
from selenium.webdriver import ActionChains
from selenium.webdriver.remote.webelement import WebElement
import ui_worktime
from selenium import webdriver
import os
from selenium.webdriver.common.by import By
from time import sleep
import datetime
import sys
from threading import Thread, Lock
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QTableWidgetItem, QAction, QLineEdit
option = webdriver.ChromeOptions()
option.add_argument('window-size=1920x3000') # 指定浏览器分辨率
option.add_argument('--headless')
option.add_argument('--disable-gpu')
option.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面
bor = webdriver.Chrome()
def counttime(time):
print(time)
tmp = time.split("-")
start = tmp[0] # 开始时间
end = tmp[1] # 结束时间
value = int(end.split(":")[0])
if (int(end.split(":")[0]) < 18 and int(end.split(":")[1]) > 30):
end = '17:30'
start = datetime.datetime.strptime(start, "%H:%M")
end = datetime.datetime.strptime(end, "%H:%M")
data = end - start # 天数小时分钟
worktime = str(data)
if not (worktime.find('-1 day, ') == -1):
worktime = worktime.replace('-1 day, ', '')
print(worktime)
tmp = worktime.split(':')
data = int(tmp[0]) * 60 + int(tmp[1])
if (value >= 18):
data -= 120
else:
data -= 90
return data
def isElementExist(browser, Type, element):
try:
if (Type == 'id'):
var = browser.find_element(By.ID, element)
return True
elif (Type == 'xpath'):
var = browser.find_element(By.XPATH, element)
return True
elif (Type == 'class'):
var = browser.find_element(By.CLASS_NAME, element)
return True
except:
return False
def connectshr():
# 全屏
bor.maximize_window()
bor.get('https://im.hmntechnologies.com/yzj-layout/home/')
user = bor.find_element(By.ID, 'account')
ui.statusBar.showMessage("Connecting...")
user.send_keys(ui.lineEdit.text())
pwd = bor.find_element(By.ID, 'pwd')
pwd.send_keys(ui.lineEdit_2.text())
btn = bor.find_element(By.CLASS_NAME, 'btn-login')
btn.click()
var = ""
if (isElementExist(bor, "class", 'login-tip')):
var = bor.find_element(By.CLASS_NAME, 'login-tip').text
print(var)
if len(var) != 0:
bor.close()
bor.quit()
ui.statusBar.showMessage('Connect Failed' + var)
else:
sleep(2)
if (isElementExist(bor, 'xpath', "//div[contains(text(),'知道了')]")):
var = bor.find_element(By.XPATH, "//div[contains(text(),'知道了')]")
var.click()
var = bor.find_element(By.XPATH, "//*[@id='home-container']/iframe")
bor.switch_to.frame(var)
if (isElementExist(bor, 'xpath',
"/html/body/div/div/div/div/div[2]/div/div/div/div[11]/div/div/div/div[2]/div/div/div/div/div/div/div/div/div/div/div[1]/div[2]/div")):
var = bor.find_element(By.XPATH,
"/html/body/div/div/div/div/div[2]/div/div/div/div[11]/div/div/div/div[2]/div/div/div/div/div/div/div/div/div/div/div[1]/div[2]/div")
var.click()
sleep(2)
handles = bor.window_handles # 获取当前浏览器的所有窗口句柄
bor.switch_to.window(handles[-1]) # 切换到最新打开的窗口
if (isElementExist(bor, 'xpath',
"/html/body/div[2]/div[2]/div[2]/button")):
var = bor.find_element(By.XPATH,
"/html/body/div[2]/div[2]/div[2]/button")
var.click()
sleep(2)
bor.get("https://hmn.kdeascloud.com/shr/dynamic.do?uipk=com.kingdee.eas.hr.ats.app.WorkCalendar.empATSDeskTop&inFrame=true&fromHeader=true&serviceId=rgS9VQrXSjmYmCSHX7QB2vI9KRA%3D")
handles = bor.window_handles # 获取当前浏览器的所有窗口句柄
bor.switch_to.window(handles[-1]) # 切换到最新打开的窗口
ui.pushButton.setEnabled(0)
ui.lineEdit.setEnabled(0)
ui.lineEdit_2.setEnabled(0)
ui.pushButton_2.setEnabled(1)
ui.statusBar.showMessage('Connect Succeeded')
def querydata():
ui.statusBar.showMessage('Querying...')
ui.tableWidget.clear()
sleep(1)
try:
var = ui.comboBox.currentText()
var = var.replace("年", '')
num = int(var)
var = bor.find_element(By.XPATH,
"/html/body/div[4]/div/div/div/div/div[3]/div/div[1]/div[1]/div[1]")
var = var.text
var = var[:4]
print(var)
while (num < int(var)):
bor.find_element(By.XPATH, '//*[@id="monthSelector"]/i').click()
sleep(1)
var = bor.find_element(By.XPATH,
"/html/body/div[4]/div/div/div/div/div[3]/div/div[1]/div[1]/div[1]").text
var = var[:4]
print(var)
while (num > int(var)):
bor.find_element(By.XPATH, '//*[@id="monthSelector"]/i[2]').click()
sleep(1)
var = bor.find_element(By.XPATH,
"/html/body/div[4]/div/div/div/div/div[3]/div/div[1]/div[1]/div[1]").text
var = var[:4]
print(var)
var = ui.comboBox_2.currentText()
var = var.replace("月", '')
num = int(var)
var = bor.find_element(By.XPATH,
"/html/body/div[4]/div/div/div/div/div[3]/div/div[1]/div[1]/div[2]/div").text
while (num < int(var)):
bor.find_element(By.XPATH, '//*[@id="monthSelector"]/i').click()
sleep(1)
num += 1
while (num > int(var)):
bor.find_element(By.XPATH, '//*[@id="monthSelector"]/i[2]').click()
sleep(1)
num -= 1
sleep(1)
lst = []
lst = bor.find_elements(By.CLASS_NAME,"planWorkTime")
lst1 = []
count = 0
for r in lst:
r.click()
sleep(0.5)
ui.tableWidget.viewport().update()
var1 =bor.find_element(By.XPATH,
"/html/body/div[4]/div/div/div/div/div[3]/div/div[2]/div[4]/div[1]/div[2]").text
var4 = ui.comboBox_2.currentText() + str(count + 1) + '日'
if count > 16:
ui.tableWidget.setItem(count - 17, 4, QTableWidgetItem(var1))
ui.tableWidget.setItem(count - 17, 3, QTableWidgetItem(var4))
else:
ui.tableWidget.setItem(count, 1, QTableWidgetItem(var1))
ui.tableWidget.setItem(count, 0, QTableWidgetItem(var4))
if not (var1 == '' or var1 == '无出勤记录'):
var3 = counttime(var1)
var3 = str(var3 // 60) + '小时' + str(var3 - (var3 // 60) * 60) + '分钟'
if (bor.find_element(By.XPATH, "/html/body/div[4]/div/div/div/div/div[3]/div/div[2]/div[7]/div[1]").text == ''):
if (counttime(var1) > 120):
lst1.append(counttime(var1))
else:
var3 = '无效工时' + var3
else:
var3 = '加班' + var3
if count > 16:
ui.tableWidget.setItem(count - 17, 5, QTableWidgetItem(str(var3)))
else:
ui.tableWidget.setItem(count, 2, QTableWidgetItem(str(var3)))
else:
if count > 16:
ui.tableWidget.setItem(count - 17, 5, QTableWidgetItem(var1))
else:
ui.tableWidget.setItem(count, 2, QTableWidgetItem(var1))
count += 1
print(len(lst1))
print(lst1)
sum = 0
ui.lineEdit_3.clear()
for l in lst1:
sum = l + sum
if (sum // 60 - len(lst1) * 8) < 0:
ui.lineEdit_3.setText(
'工时' + str(sum // 60) + '小时' + str(sum - (sum // 60) * 60) + '分钟' + ' ' + '应当工作' + str(
len(lst1) * 8) + '小时' + ' ' + '工时余量' + str(sum // 60 - len(lst1) * 8 + 1) + '小时' + str(
sum - (sum // 60) * 60 - 60) + '分钟')
else:
ui.lineEdit_3.setText(
'工时' + str(sum // 60) + '小时' + str(sum - (sum // 60) * 60) + '分钟' + ' ' + '应当工作' + str(
len(lst1) * 8) + '小时' + ' ' + '工时余量' + str(sum // 60 - len(lst1) * 8) + '小时' + str(
sum - (sum // 60) * 60) + '分钟')
print('工时' + str(sum // 60) + '小时' + str(sum - (sum // 60) * 60) + '分钟')
print('应当工作' + str(len(lst1) * 8) + '小时')
print('工时余量' + str(sum // 60 - len(lst1) * 8) + '小时' + str(sum - (sum // 60) * 60) + '分钟')
ui.tableWidget.setHorizontalHeaderLabels(['日期', '有效出勤', '工作时间', '日期', '有效出勤', '工作时间'])
lst.clear()
lst1.clear()
ui.statusBar.showMessage('Query OK')
except:
print("异常")
ui.statusBar.showMessage('Query Error')
# 主窗体对象调用setupUi方法,对QMainWindow对象进行设置
def closedrive():
try:
print('123')
handles = bor.window_handles # 获取当前浏览器的所有窗口句柄
for handle in handles:
bor.switch_to.window(handle)
bor.close()
bor.quit()
except:
print('err')
def about1():
print('11')
QMessageBox.about(w, '关于', '余量工时计算工具 v1.1')
if __name__ == '__main__':
global w, ui, App
# 创建线程01,不指定参数
App = QApplication(sys.argv) # 创建QApplication对象,作为GUI主程序入口
ui = ui_worktime.Ui_mainWindow() # 创建主窗体对象
w = ui_worktime.MyWidget() # 实例化QMainWindow类
ui.setupUi(w)
w.setbor(bor)
w.setWindowIcon(QIcon("favicon.ico"))
w.setFixedSize(620, 720)
# qss = "QWidget#mainWindow{border-image:url(下载.bmp);}"
# w.setStyleSheet( qss )
ui.tableWidget.setColumnCount(6)
ui.tableWidget.setRowCount(17)
ui.tableWidget.verticalHeader().setVisible(0)
# ui.tableWidget.setStyleSheet( "background-color:rgba(0,0,0,0)" );
ui.actionabout.triggered.connect(about1)
ui.menubar.addAction(ui.actionabout)
ui.tableWidget.setHorizontalHeaderLabels(['日期', '有效出勤', '工作时间', '日期', '有效出勤', '工作时间'])
ui.tableWidget.horizontalHeader().setHighlightSections(True)
ui.pushButton_2.setEnabled(0)
ui.pushButton.clicked.connect(connectshr)
ui.pushButton_2.clicked.connect(querydata)
w.show()
# App.exit()
App.exec_() # 循环中等待退出程序
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结