Автоматическое обновление профилей
Установка wheel обновляет библиотеку. Браузерные профили DuckoNet 0.11.5 загружает автоматически при работе с клиентом.
Для начала нужны API-ключ DuckoLab и название браузера. Сам браузер устанавливать не требуется. Доступны профили Chrome и Microsoft Edge. Выбор семейства задаётся параметром browser.
import os
from duckonet import HttpClient
urls = ["https://example.com/", "https://example.org/"]
with HttpClient(
api_key=os.environ["DUCKONET_API_KEY"],
browser="chrome",
version="last",
) as client:
for url in urls:
with client.run():
response = client.get(url)
response.raise_for_status()
print(response.status_code)
last выбирает последний опубликованный DuckoLab профиль, который разрешён вашим тарифом и совместим с установленной библиотекой. Это не обещание поддержки любой только что вышедшей версии браузера. Для Free действует отставание браузерных версий; Pro получает доступные актуальные профили. Число потоков тарифами DuckoNet не ограничивается.
Где проходит граница обновления
client.run() — один полный прогон вашего сценария. Поместите внутрь него все связанные запросы, обработку ответов и отправку результата:
import os
from duckonet import HttpClient
with HttpClient(
api_key=os.environ["DUCKONET_API_KEY"],
browser="chrome",
version="last",
) as client:
with client.run():
page = client.get("https://example.com/")
page.raise_for_status()
# Последующие запросы этого сценария также выполняйте внутри run().
Весь прогон использует один профиль. Новая версия может загрузиться в фоне между его запросами, но будет выбрана только следующим прогоном. Завершения всех параллельных прогонов ждать не требуется: длинный прогон продолжает работу на своей версии, а освободившийся worker начинает следующий на готовой новой версии. Библиотека не повторяет запросы и не перезапускает ваш сценарий ради обновления.
Без run() профиль закрепляется до закрытия клиента. DuckoNet не пытается угадать конец сценария по паузе между запросами.
Значение version | Поведение |
|---|---|
"last" | Фоновая проверка и загрузка; готовый профиль выбирается между прогонами. |
None | Доступный профиль выбирается при открытии клиента и остаётся закреплённым. |
Полная версия, например "155.0.8059.84" | Используется именно эта версия, если она доступна. Скрытой подмены другой версией нет. |
Указывайте полную версию из каталога. Строка "155" не заменяет "155.0.8059.84".
Асинхронный код
import asyncio
import os
from duckonet import AsyncHttpClient
async def main():
async with AsyncHttpClient(
api_key=os.environ["DUCKONET_API_KEY"],
browser="chrome",
version="last",
) as client:
for url in ["https://example.com/", "https://example.org/"]:
async with client.run():
response = await client.get(url)
response.raise_for_status()
print(response.status_code)
asyncio.run(main())
Вложенный run() того же клиента наследует внешний профиль. Дочерние asyncio-задачи наследуют контекст прогона; обычно их следует дождаться до выхода из него. После выхода новые запросы из унаследованного завершённого контекста отклоняются. Уже начатый запрос или открытый поток сохраняет своё поколение до завершения либо закрытия. Для потоковых ответов используйте контекст client.stream(...) и своевременно закрывайте его.
В обычные Python threads контекст не переносится автоматически. Если работа относится к тому же ещё открытому прогону, его можно передать стандартным contextvars.copy_context().run. Для самостоятельного worker открывайте свой client.run().
Cookies и настройки клиента
Cookies принадлежат логическому клиенту. Они сохраняются при смене профиля, включая ручные изменения, автоматические Set-Cookie, сроки и область действия. Сохранённая ссылка на контейнер продолжает работать:
import os
from duckonet import HttpClient
with HttpClient(
api_key=os.environ["DUCKONET_API_KEY"],
browser="chrome",
version="last",
) as client:
jar = client.cookies
jar.set("language", "ru", url="https://example.com/", path="/")
with client.run():
response = client.get("https://example.com/")
response.raise_for_status()
Поздний ответ старого прогона обрабатывается в том же контейнере. Обновление профиля не восстанавливает удалённый снимок cookies и не продлевает их срок. Разовые cookies= не становятся постоянными. Параметры cookies_enabled и persist_cookies продолжают действовать. У разных клиентов отдельные контейнеры, даже если они используют один API-ключ или каталог кэша.
Пользовательские заголовки, proxy и остальные настройки клиента сохраняются. Внешний сайт при смене браузерного отпечатка может сам завершить свою сессию; сохранение cookies не отменяет политику сайта.
Загрузка, ошибки и права
Библиотека загружает только выбранный профиль и необходимые общие компоненты. Подписи, размеры и хеши проверяются до использования. Подходящие проверенные файлы используются повторно; все профили Chrome сразу не скачиваются.
По умолчанию проверки разделены примерно пятью минутами. check_interval задаётся в секундах при создании клиента. Есть небольшой разброс времени, а после ошибок интервал увеличивается. Обнаружение, загрузка и переключение не происходят мгновенно после публикации.
Ошибка сети или повреждённая загрузка не заменяет действующий профиль неполным кандидатом. Старый профиль можно использовать, пока действуют его права и сроки. Несовместимое обновление сообщается как upgrade_required: в таком случае нужно обновить саму библиотеку.
Права проверяются перед выдачей файлов и перед назначением профиля новому прогону. Наличие Pro-файла в кэше не даёт бессрочный Pro-доступ. После получения отзыва или истечения допустимых прав новые операции не разрешаются. Отзыв API-ключа блокирует новые обращения с ним; уже выданное подписанное разрешение ограничено своим сроком. Мгновенный отзыв у отключённого от сети клиента не гарантируется.
API-ключ остаётся в памяти открытого клиента и не записывается в URL или настройки профиля. Закрывайте клиент через with или async with, чтобы остановить его фоновую работу и освободить ресурсы.
Как узнать выбранный профиль
Внутри прогона client.browser_profile содержит его фактические browser, version, profile_id и generation. Вне прогона свойство показывает исходный закреплённый профиль клиента. client.profile_update_status описывает фоновое обновление: например, current, ready, retrying или upgrade_required. Это диагностика, а не требование вручную вызывать обновление.
При обновлении wheel сохраняйте прежний state_dir: там находятся установка и её история. Не удаляйте его ради обычного обновления и не создавайте новую регистрацию вместо продолжения существующей установки.
Для Edge укажите browser="edge". last выбирает версию в этом семействе; при отсутствии подходящего Edge библиотека сообщает ошибку выбора, а не переключается на Chrome. Примеры для Edge.