Разработка ботов — это сложно.
Детекторы ботов вроде Cloudflare готовы защищать сайты от наших ботов. Настройка Selenium с помощью ChromeOptions слишком громоздкая, а на Windows становится совсем кошмарной. Отладка ботов через журналы — тоже слишком сложно.
Как решить эти боли, не жертвуя скоростью и удобством разработки? Попробуйте Bose.
Team Lead Python Developer HR TECH (Проект Мобильный личный кабинет) АО «Гринатом», , можно удалённо, По итогам собеседования tproger.ru Вакансии на tproger.ru
Bose, как уверяют разработчики фреймворка, — это первая среда разработки ботов, которая максимально упрощает разработку ботов. Фреймворк основан на на Selenium и предлагает ряд функций, упрощающих разработку.
GitHub — omkarcloud/bose: The Ultimate Web Scraping Framework github.com
Первым делом, скопируем изначальный шаблон.
git clone
Затем перейдите в скачанный каталог, установите зависимости и запустите проект:
cd my-bose-project python -m pip install -r requirements.txt python main.py
Первый запуск займет некоторое время. Всё потому, что он загружает исполняемый файл драйвера Chrome. Следующие запуски будут гораздо быстрее.
Добавляет мощные методы, чтобы сделать работу с Selenium намного проще.
Применяет лучшие практики, чтобы избежать обнаружения ботов Cloudflare и PerimeterX.
Сохраняет HTML, снимок экрана и сведения о выполнении для каждой задачи, что упрощает отладку.
Вспомогательные компоненты для записи очищенных данных в виде файлов JSON, CSV и Excel.
Автоматически загружает и инициализирует правильный драйвер Chrome.
Быстро и удобно для разработчиков.
Допустим, вы хотите начать парсинг веб-сайта. Если бы вы использовали 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’)
В 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, когда в задаче парсинга возникает исключение, браузер остается открытым. Вы можете отслеживать состояние браузера в момент возникновения исключения, что очень помогает при отладке.
При веб-скрапинге часто возникают ошибки вроде неправильных селекторов или страниц, которые не загружаются. При отладке в 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 и парсинга веб-страниц.
Желаем вам удачи и счастливой разработки ботов с помощью Bose Framework!
Детекторы ботов вроде Cloudflare готовы защищать сайты от наших ботов. Настройка Selenium с помощью ChromeOptions слишком громоздкая, а на Windows становится совсем кошмарной. Отладка ботов через журналы — тоже слишком сложно.
Как решить эти боли, не жертвуя скоростью и удобством разработки? Попробуйте Bose.
Team Lead Python Developer HR TECH (Проект Мобильный личный кабинет) АО «Гринатом», , можно удалённо, По итогам собеседования tproger.ru Вакансии на tproger.ru
Bose, как уверяют разработчики фреймворка, — это первая среда разработки ботов, которая максимально упрощает разработку ботов. Фреймворк основан на на Selenium и предлагает ряд функций, упрощающих разработку.
GitHub — omkarcloud/bose: The Ultimate Web Scraping Framework github.com
Настраиваем Bose
Первым делом, скопируем изначальный шаблон.
git clone
You do not have permission to view link please Вход or Регистрация
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 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 и парсинга веб-страниц.
Желаем вам удачи и счастливой разработки ботов с помощью Bose Framework!