В этом проекте я создал программу очистки веб-страниц, чтобы очищать свое рабочее расписание от стороннего приложения, которое использует моя работа. Поскольку каждый раз входить в приложение неудобно, я подумал, что если бы я мог просто очистить свое расписание и добавить его в свой календарь, это было бы полезно.

Это был мой первый проект веб-скрейпинга, поэтому я знал, что, возможно, есть более простые способы сделать это, но это то, что я придумал. Я собираюсь поработать над этим еще немного, чтобы добавить больше функциональности, например, автоматически сохранить его в текстовый файл и импортировать в общий календарь Apple с моей мамой и девушкой, чтобы ей не приходилось постоянно спрашивать меня, что время работаю, а там посмотрим.

Сначала я импортировал необходимые библиотеки для парсинга: selenium, requests, BeautifulSoup и несколько модулей из selenium.webdriver. Я также устанавливаю параметры для драйвера Chrome, такие как detach=True, которые оставляют окно браузера открытым после завершения выполнения скрипта.

import selenium
from selenium import webdriver
import requests
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_experimental_options = ("detach", True)

driver = webdriver.Chrome(
    options=options, service=Service(ChromeDriverManager().install())
)

Затем я загрузил веб-страницу, используя driver.get(). Я установил переменную флага webpage_loaded, чтобы указать, была ли загружена веб-страница или нет, и зацикливаюсь до тех пор, пока пользователь не введет «выход».

driver.get("https://app.workjam.com/schedule/view")

webpage_loaded = False

while True:
    go = input("Press Enter to continue or enter 'exit' to quit: ")
    
    if go == "exit":
        break
    
    if not webpage_loaded:
        WebDriverWait(driver, 200).until(
            EC.presence_of_element_located((By.CLASS_NAME, "sc-iuRYzW"))
        )
        webpage_loaded = True

Затем я очистил страницу с помощью BeautifulSoup и нашел таблицу, содержащую данные расписания. Я нашел строку заголовка и ячейки даты, а затем повторил строку тела, чтобы получить запланированные рабочие ячейки и соответствующие даты.

soup = BeautifulSoup(driver.page_source, "html.parser")
table = soup.find("table", {"class": "sc-gPpHY"})

header_row = table.find("thead").find("tr")
date_cells = header_row.find_all("div", {"class": "kaIdQW"})

body_row = table.find("tbody").find("tr").select("td")
date_index = -2
dates = []

for date_cell in date_cells:
    dates.append(date_cell.text.strip())

paired_dates = []
for i in range(0, len(dates), 2):
    paired_dates.append(dates[i] + " " + dates[i + 1])

for body_cell in body_row:
    date_index += 1
    if body_cell.find("span", {"class": "sc-iuRYzW sc-iorJWx gqdRaB gSgWbu"}):
        date = paired_dates[date_index]
        time = body_cell.find("span", {"class": "sc-iuRYzW sc-iorJWx gqdRaB gSgWbu"}).find(

Когда вы запускаете код, он сначала открывает окно Chrome и переходит на страницу расписания веб-сайта WorkJam. Затем он ждет, пока пользователь что-нибудь введет — либо нажмет Enter, чтобы продолжить, либо наберет «exit», чтобы выйти из программы.

После того, как пользователь решил продолжить, программа очищает информацию о расписании со страницы и распечатывает запланированную работу для каждой даты вместе с соответствующим временем. Например, вывод может выглядеть так:

Scheduled work for Saturday Apr 22, 2023 9:30 AM - 1:30 PM
Scheduled work for Sunday Apr 23, 2023 9:30 AM - 1:30 PM
Scheduled work for Wednesday Apr 26, 2023 9:30 AM - 1:30 PM
Scheduled work for Thursday Apr 27, 2023 9:30 AM - 1:30 PM
Scheduled work for Friday Apr 28, 2023 9:30 AM - 1:30 PM

Выходные данные показывают дату и время для каждой запланированной рабочей смены, которую программа нашла на странице. Стоит отметить, что выходные данные будут меняться в зависимости от того, какие данные расписания в настоящее время доступны на веб-сайте WorkJam.

Что касается будущих улучшений, я упомянул в своем блоге, что хотел бы добавить в программу дополнительные функции — например, автоматическое сохранение данных расписания в текстовый файл или их импорт в общий календарь. Эти улучшения сделают программу еще более полезной для отслеживания моего рабочего графика.