爬虫小项目

105 阅读5分钟

1.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_() # 循环中等待退出程序

2.ui_worktime.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ui_worktime.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QTableWidgetItem, QAction, QLineEdit

class Ui_mainWindow():
    def setupUi(self, mainWindow):
        mainWindow.setObjectName("mainWindow")
        mainWindow.resize(814, 832)
        self.centralwidget = QtWidgets.QWidget(mainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setMouseTracking(True)
        self.tableWidget.setTabletTracking(True)
        self.tableWidget.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.gridLayout_3.addWidget(self.tableWidget, 2, 0, 1, 1)
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setEnabled(True)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.gridLayout_3.addWidget(self.lineEdit_3, 3, 0, 1, 1)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 3, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 1, 2, 1, 1)
        self.horizontalLayout_2.addLayout(self.gridLayout)
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setObjectName("groupBox")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.comboBox = QtWidgets.QComboBox(self.groupBox)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.horizontalLayout.addWidget(self.comboBox)
        self.comboBox_2 = QtWidgets.QComboBox(self.groupBox)
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.horizontalLayout.addWidget(self.comboBox_2)
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        self.gridLayout_2.addLayout(self.horizontalLayout, 1, 0, 1, 1)
        self.horizontalLayout_2.addWidget(self.groupBox)
        self.gridLayout_3.addLayout(self.horizontalLayout_2, 1, 0, 1, 1)
        mainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(mainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 814, 23))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        mainWindow.setMenuBar(self.menubar)
        self.statusBar = QtWidgets.QStatusBar(mainWindow)
        self.statusBar.setObjectName("statusBar")
        mainWindow.setStatusBar(self.statusBar)
        self.actionabout = QtWidgets.QAction(mainWindow)
        self.actionabout.setObjectName("actionabout")
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(mainWindow)
        QtCore.QMetaObject.connectSlotsByName(mainWindow)
        mainWindow.setTabOrder(self.lineEdit, self.lineEdit_2)
        mainWindow.setTabOrder(self.lineEdit_2, self.comboBox)
        mainWindow.setTabOrder(self.comboBox, self.comboBox_2)
        mainWindow.setTabOrder(self.comboBox_2, self.tableWidget)
        mainWindow.setTabOrder(self.tableWidget, self.lineEdit_3)

    def retranslateUi(self, mainWindow):
        _translate = QtCore.QCoreApplication.translate
        mainWindow.setWindowTitle(_translate("mainWindow", "余量工时计算工具"))
        self.label.setText(_translate("mainWindow", "账  号  名"))
        self.label_2.setText(_translate("mainWindow", "密     码"))
        self.pushButton.setText(_translate("mainWindow", "Log In"))
        self.groupBox.setTitle(_translate("mainWindow", "查询时间"))
        self.comboBox.setItemText(0, _translate("mainWindow", "2022年"))
        self.comboBox.setItemText(1, _translate("mainWindow", "2020年"))
        self.comboBox.setItemText(2, _translate("mainWindow", "2021年"))
        self.comboBox.setItemText(3, _translate("mainWindow", "2023年"))
        self.comboBox.setItemText(4, _translate("mainWindow", "2024年"))
        self.comboBox.setItemText(5, _translate("mainWindow", "2025年"))
        self.comboBox_2.setItemText(0, _translate("mainWindow", "1月"))
        self.comboBox_2.setItemText(1, _translate("mainWindow", "2月"))
        self.comboBox_2.setItemText(2, _translate("mainWindow", "3月"))
        self.comboBox_2.setItemText(3, _translate("mainWindow", "4月"))
        self.comboBox_2.setItemText(4, _translate("mainWindow", "5月"))
        self.comboBox_2.setItemText(5, _translate("mainWindow", "6月"))
        self.comboBox_2.setItemText(6, _translate("mainWindow", "7月"))
        self.comboBox_2.setItemText(7, _translate("mainWindow", "8月"))
        self.comboBox_2.setItemText(8, _translate("mainWindow", "9月"))
        self.comboBox_2.setItemText(9, _translate("mainWindow", "10月"))
        self.comboBox_2.setItemText(10, _translate("mainWindow", "11月"))
        self.comboBox_2.setItemText(11, _translate("mainWindow", "12月"))
        self.pushButton_2.setText(_translate("mainWindow", "查询"))

        self.actionabout.setText(_translate("mainWindow", "关于"))
class MyWidget(QMainWindow):
    def closeEvent(self, event):
        result = QtWidgets.QMessageBox.question(self, "标题", "亲,你确定想关闭我?别后悔!!!'_'", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
        if(result == QtWidgets.QMessageBox.Yes):
            event.accept()
            self.closedrive()
        else:
            event.ignore()
    def setbor(self,bor):
        self.bor = bor


    def closedrive(self):
        try:
            print('123')
            handles = self.bor.window_handles  # 获取当前浏览器的所有窗口句柄
            for handle in handles:
                self.bor.switch_to.window(handle)
                self.bor.close()
            self.bor.quit()

        except:
            print('err')