Быстро и просто автоматизируем парсинг данных с сайта на Python

Автор: Даниил Джепаров, Lead аналитик в «Сравни» и автор Telegram-канала @data_study

Всем привет! В этой статье расскажу как можно автоматизировать парсинг данных с сайта techcrunch.com с помощью инструмента Cloud Functions.

Для начала опишу в чем заключается проект.

1. Берем данные новостей с сайта techcrunch.com с помощью написанного парсера на Python

2. Загружаем полученные данные в таблицу в базу данных PostgreSQL

3. Автоматизируем 2 первых шага с помощью сервиса Cloud Functions в Яндекс Облаке по расписанию

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

Пишем парсер

Предоставлю готовый кусок кода и опишу смысл каждой функции.

import os import requests from bs4 import BeautifulSoup import pandas as pd import sqlalchemy as sa from loguru import logger login = os.environ['login'] password = os.environ['password'] host = os.environ['host'] def load_to_db(df): connection_string = f"postgresql+psycopg2://{login}:{password}@{host}/postgres" engine = sa.create_engine(connection_string) with engine.connect() as connection: df.to_sql(name='techcrunch_articles', schema='public', con=connection, index=False, if_exists='append') connection.close() logger.info('загрузка завершена') def parse_techcrunch(url): response = requests.get(url) logger.info(f'reesonse: {response}') articles_list = [] soup = BeautifulSoup(response.content, 'html.parser') all_articles = soup.find_all('li', class_='wp-block-post') # Extract the required information from each article for article in all_articles: title_tag = article.find('a', class_='loop-card__title-link') title = title_tag.get_text(strip=True) if title_tag else 'no title' article_link = title_tag['href'] if title_tag else 'no link' category_tag = article.find('a', class_='loop-card__cat') category = category_tag.get_text(strip=True) if category_tag else 'no category' author_tag = article.find('a', class_='loop-card__author') author = author_tag.get_text(strip=True) if author_tag else 'no authors' image_tag = article.find('img') image_url = image_tag['src'] if image_tag else 'no image' date_tag = article.find('time') date_data = date_tag['datetime'] if date_tag else 'no date' response_article = requests.get(article_link) soup_article = BeautifulSoup(response_article.content, 'html.parser') article_tag = soup_article.find('p', id='speakable-summary') summary = article_tag.get_text(strip=True) if article_tag else 'no summary' articles_list.append({ 'title':title, 'category':category, 'author': author, 'image_url': image_url, 'date_data': date_data, 'article_link': article_link, 'summary': summary }) df = pd.DataFrame(articles_list) return df def main(event, context): url = "https://techcrunch.com/tag/apple/" df_example = parse_techcrunch(url) load_to_db(df_example) logger.info('парсер отработал успешно')

load_to_db(df) - функция подключения к базе данных postgres и загрузки входящего датафрейма df в таблицу внутри базы данных. В функции использзуются переменные окружения для подключения к базе данных. Укажите вместо них свои переменные от вашей базы данных, наппример можно создать базу данных также в облаке.

parse_techcrunch(url) - функция сбора данных с сайта techcrunch по указанному url. здесь используем библиотеку beautifulsoup чтобы достать данные из html разметки сайта, дальше преобразовать эти данные в вид pandas датафрейма (табличный вид).

main(event, context) - основная функция, которая внутри себя вызывает 2 остальные функции. Она нужна для того, чтобы именно эту функцию запускать в сервисе Cloud Functions. Входные параметры event и context указаны для использования инструмента триггеров, но в самой функции эти параметры не используются.

Автоматизируем в Cloud Functions

Используем сервис Cloud Functions в Яндекс Облаке. Можно конечно настроить автоматизацию по-другому, например настроить виртуальную машину, настроить cron-джобу для запуска скрипта, или вообще использовать другие инструменты, например Apache Airflow (но его тоже нужно самому настраивать на виртуальной машине).

В чем плюсы сервиса облачный функций в отличии от настройки виртуальной машины, cron-джобов и подобных решений:

+ не нужно арендовать виртуальную машину и платить за это

+ не нужно настраивать виртуальную машину и инструменты автоматизации на ней

+ тарификация Cloud Functions очень выгодная, для нашей задачи использования сервиса будет вообще бесплатным.

Как создавать Яндекс Облако я здесь расписывать не буду, описание будет с момента когда оно у вас уже появилось.

Создаем сервисный аккаунт для работу cloud функции

Создать его можно по инструкции. Обратите внимание, что сервисный аккаунт для работы с функциям должен иметь роли functions.mdbProxiesUser и functions.functionInvoker

Настраиваем Cloud функцию

Заходим в сервис Cloud Functions, создаем Python функцию и в редактор вставляем скрипт из этой статьи. Дополнительно создаем файле requirements.txt и указываем в нем для установки следующие библиотеки

requests beautifulsoup4 sqlalchemy pandas loguru psycopg2
Интерфейс создания функции
Интерфейс создания функции
Настройки функции и переменных окружения
Настройки функции и переменных окружения

Сохраняем все изменения в функции

Тестируем функцию

Для запуска функции нужно перейти во вкладку "Тестирование" и нажать "Запустить тест"

Запуск теста фукнции
Запуск теста фукнции

При успешном выполнении функции ниже в Результате тестирования состояние функции будет в статусе "Выполнена"

Успешный тест
Успешный тест

Настройка триггера для запуска функции по расписанию

В том же сервисе переходим в раздел Триггеры и создаем триггер со следующими параметрами

Создание триггера
Создание триггера

Теперь ваша функция будет запускаться каждый день в 10:15.

Заключение

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

Кто хочет детально посмотреть этот проект и ход его реализации, можно посмотреть видео.

Если у вас возникнут вопросы, можете писать мне в телеграм @daniildzheparov

Автор: Даниил Джепаров, Lead аналитик в Сравни и автор телеграм-канала @data_study

1
2 комментария