Почалося все з простого завдання — збору даних через веб-скрапінг, але незабаром це призвело до створення хмарної платформи на основі старого комп'ютера Dell Optiplex, що був змонтований на стіні.
Ми почали з того, щоб зібрати дані з кількох вебсайтів, використовуючи API або скрапінг, і помістити їх у DataFrame. Це мало стати основою для функції в хмарі, яка б оновлювала дані раз на тиждень, місяць чи рік.
Все почалося досить легко. Спочатку використовували Python-модуль BeautifulSoup для збору даних з Wikipedia, зокрема про міста. Потім ми створювали набір даних, що включав таку інформацію, як населення, географічні координати та інші цікаві факти про міста. Завданням було написати динамічну функцію для збору даних з будь-якої Wikipedia-сторінки, навіть якщо форматування було поганим.
Код, який ми використовували для конвертації географічних координат з формату DMS у десятковий:
d+)\°(?:\s*(\d+)\′?)?(?:\s*(\d+)\″?)?\s*([NSWE])?", dms)
if not match:
return None
d, m, s, dir_ = int(match[1]), int(match[2] or 0), int(match[3] or 0), match[4]
decimal = d + m / 60 + s / 3600
return round(-decimal if dir_ in "SW" else decimal, 6)
І ось як ми витягували широту та довготу зі сторінок Wikipedia:
def get_lat_lon(soup):
lat = soup.find("span", class_="latitude")
lon = soup.find("span", class_="longitude")
return dms_to_decimal(lat.text) if lat else None, dms_to_decimal(lon.text) if lon else None
Для збереження всіх зібраних даних ми використовували MySQL, створюючи базу даних для проєктів, і підключалися до неї за допомогою SQLAlchemy. Задача виглядала не складно, але при роботі з VS Code виникла перша велика проблема — налаштування середовища для роботи. Я не зміг правильно налаштувати шляхи до інсталяцій, і це стало для мене справжнім викликом, поки я не зрозумів, що помилково встановив програму в нестандартний шлях.
Згодом, після кількох годин боротьби, я встановив необхідні модулі вручну і зміг налаштувати правильне підключення до SQL бази даних. Ось як виглядав код для підключення до MySQL:
import pandas as pd
from sqlalchemy import create_engine
schema = "dataset"
host = "127.0.0.1"
user = "root"
password = "userpassword"
port = 3306
connection_string = f'mysql+pymysql://{user}:{password}@{host}:{port}/{schema}'
engine = create_engine(connection_string)
city_data_df.to_sql('city_data', con=engine, if_exists='replace', index=False)
print("Дані успішно вставлені в базу даних MySQL.")
Після того, як це було налаштовано, я продовжив працювати над додатком. Для створення веб-інтерфейсу використовував Flask, де основний функціонал включав підключення до MySQL, створення нових проєктів і запуск скриптів через Python, а також відображення статусу проєктів.
Після завершення основної частини роботи з кодом я налаштував доступ до додатку через ngrok, що дозволило отримати публічний URL для доступу з будь-якого місця. З допомогою цієї технології я зміг тестувати і перевіряти свою платформу без необхідності налаштовувати складні мережеві з'єднання або проброс портів.
Згодом я додав HTML-код для інтерфейсу користувача, створивши простий веб-додаток з можливістю запуску проектів, відображення їх статусу (активний, виконання, завершено) і основними стилями. Проєкт виглядав ось так:
Завершивши це, я отримав повністю функціональне хмарне середовище на власному сервері. Після 10 днів важкої роботи, усунення помилок і навчання на ходу я зрозумів, як багато нового я дізнався, і це справді підвищило мою впевненість у своїх силах. Тепер я готовий до більш складних проєктів, і мені цікаво, куди мене заведе цей шлях у світі хмарних обчислень.
Перекладено з: One Web Scrape Away from a Breakdown