Bose — фреймворк для создания веб-ботов, который проще Selenium

Аватарка пользователя Рафаил Агазода

Bose Framework — это улучшенный Selemium, который позволяет быстро и просто настраивать ботов и заниматься быстрой отладкой.

Разработка ботов — это сложно.

Детекторы ботов вроде Cloudflare готовы защищать сайты от наших ботов. Настройка Selenium с помощью ChromeOptions слишком громоздкая, а на Windows становится совсем кошмарной. Отладка ботов через журналы — тоже слишком сложно.

Как решить эти боли, не жертвуя скоростью и удобством разработки? Попробуйте Bose.

Bose, как уверяют разработчики фреймворка, — это первая среда разработки ботов, которая максимально упрощает разработку ботов. Фреймворк основан на на Selenium и предлагает ряд функций, упрощающих разработку.

Настраиваем Bose

Первым делом, скопируем изначальный шаблон.

			git clone https://github.com/omkarcloud/bose-starter my-bose-project
		

Затем перейдите в скачанный каталог, установите зависимости и запустите проект:

			cd my-bose-project
python -m pip install -r requirements.txt
python main.py
		

Первый запуск займет некоторое время. Всё потому, что он загружает исполняемый файл драйвера Chrome. Следующие запуски будут гораздо быстрее.

Основные особенности Bose Framework

Добавляет мощные методы, чтобы сделать работу с Selenium намного проще.

Применяет лучшие практики, чтобы избежать обнаружения ботов Cloudflare и PerimeterX.

Сохраняет HTML, снимок экрана и сведения о выполнении для каждой задачи, что упрощает отладку.

Вспомогательные компоненты для записи очищенных данных в виде файлов JSON, CSV и Excel.

Автоматически загружает и инициализирует правильный драйвер Chrome.

Быстро и удобно для разработчиков.

Работаем с Bose

Допустим, вы хотите начать парсинг веб-сайта. Если бы вы использовали Selenium, вам пришлось бы обрабатывать задачи по открытию и закрытию драйвера следующим образом:

			from selenium import webdriver

driver_path = 'path/to/chromedriver'

driver = webdriver.Chrome(executable_path=driver_path)

driver.get('https://www.example.com')

driver.quit()
		

Однако Bose Framework использует декларативный и структурированный подход. Вам нужно только написать код ниже, а драйвер Bose сам создаст драйвер, передаст его методу run и закроет работу.

			from bose import *

class Task(BaseTask):
    def run(self, driver):
        driver.get('https://www.example.com')
		

Конфигурация Bose

В Selenium, если вы захотите настроить параметры вроде профиля, пользовательского агента или размера окна, нужно будет написать много кода:

			from selenium.webdriver.chrome.options import Options
from selenium import webdriver

driver_path = 'path/to/chromedriver.exe'

options = Options()

profile_path = '1'

options.add_argument(f'--user-data-dir={profile_path}')

user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.37")'
options.add_argument(f'--user-agent={user_agent}')

window_width = 1200
window_height = 720
options.add_argument(f'--window-size={window_width},{window_height}')

driver = webdriver.Chrome(executable_path=driver_path, options=options)
		

Bose Framework упрощает конфигурацию, инкапсулируя её в свойстве BrowserConfig:

			from bose import BaseTask, BrowserConfig, UserAgent, WindowSize

class Task(BaseTask):
    browser_config = BrowserConfig(user_agent=UserAgent.user_agent_106, window_size=WindowSize.window_size_1280_720, profile=1)
		

Обработка исключений

Исключения — это боль при работе с Selenium.

В Selenium, если возникает исключение, драйвер автоматически закрывается, оставляя вам только журналы для отладки.

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

Bose — фреймворк для создания веб-ботов, который проще Selenium 1

Отладка в Bose Framework

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

Bose упрощает отладку, сохраняя информацию о каждом запуске.

После каждого запуска в задачах создается каталог, содержащий три файла, перечисленных ниже:

			task_info.json
		

Файл содержит информацию о выполнении задачи: продолжительность выполнения задачи, IP-адрес задачи, пользовательский агент, размер окна и профиль, который использовался для выполнения задачи.

			final.png
		

Это снимок экрана, сделанный до закрытия драйвера.

			page.html
		

Это исходный HTML-код, полученный до закрытия драйвера. Код страницы полезно знать, если селекторам не удалось выбрать элементы.

			error.log
		

В случае, если ваша задача рухнула из-за исключения, Bose сохраняет error.log с ошибкой, из-за которой задача рухнула.

Вывод данных

После выполнения парсинга веб-страниц нужно сохранить данные в формате JSON или CSV. Как правило, этот процесс подразумевает написание огромного объёма императивного кода:

			import csv
import json

def write_json(data, filename):
    with open(filename, 'w') as fp:
        json.dump(data, fp, indent=4)

def write_csv(data, filename):
    with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
        fieldnames = data[0].keys()  # get the fieldnames from the first dictionary
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()  # write the header row
        writer.writerows(data)  # write each row of data

data = [
    {
        "text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d",
        "author": "Albert Einstein"
    },
    {
        "text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d",
        "author": "J.K. Rowling"
    }
]

write_json(data, "data.json")
write_csv(data, "data.csv")
		

Bose упрощает процесс, инкапсулируя данные в модуль вывода для чтения и записи данных. Просто метод write для файла, который вы хотите сохранить.

Все данные будут сохранены в папке output/:

			from bose import Output

data = [
    {
        "text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d",
        "author": "Albert Einstein"
    },
    {
        "text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d",
        "author": "J.K. Rowling"
    }
]

Output.write_json(data, "data.json")
Output.write_csv(data, "data.csv")
		

Локальное хранилище

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

Вы можете импортировать объект LocalStorage из Bose, чтобы сохранять данные при запуске браузера, что чрезвычайно полезно при очистке больших объемов данных.

Данные хранятся в файле local_storage.json в корневом каталоге проекта. Вот как можно его использовать:

			from bose import LocalStorage

LocalStorage.set_item("pages", 5)
print(LocalStorage.get_item("pages"))
		

Другие возможности

Драйвер, полученный при запуске задачи — это расширенная версия Selenium, в которую добавлены мощные методы, упрощающие работу.

Вот некоторые из популярных методов, добавленных в драйвер:

Bose — фреймворк для создания веб-ботов, который проще Selenium 2

Заключение

Bose — отличный фреймворк, упрощающий скучные части Selenium и парсинга веб-страниц.

Желаем вам удачи и счастливой разработки ботов с помощью Bose Framework!

Веб-разработка
Парсинг
Инструменты
Python
Боты
Фреймворки
6530