В этом проекте я создал программу очистки веб-страниц, чтобы очищать свое рабочее расписание от стороннего приложения, которое использует моя работа. Поскольку каждый раз входить в приложение неудобно, я подумал, что если бы я мог просто очистить свое расписание и добавить его в свой календарь, это было бы полезно.
Это был мой первый проект веб-скрейпинга, поэтому я знал, что, возможно, есть более простые способы сделать это, но это то, что я придумал. Я собираюсь поработать над этим еще немного, чтобы добавить больше функциональности, например, автоматически сохранить его в текстовый файл и импортировать в общий календарь 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.
Что касается будущих улучшений, я упомянул в своем блоге, что хотел бы добавить в программу дополнительные функции — например, автоматическое сохранение данных расписания в текстовый файл или их импорт в общий календарь. Эти улучшения сделают программу еще более полезной для отслеживания моего рабочего графика.