Skip to main content

Lazy utils each I use sometimes

Project description

Различные утилиты которые лень писать каждый раз

  • saver - Предназначена для сохранения файлов
  • ua - Ротация юзер агентов. Мне не очень нравятся другие библиотеки
  • repo - Базовый репозиторий для crud операция а также фабрика
  • parsed - Сохраняет в csv спарсенные и не удачно спарсенные файлы
  • proxy - Менеджер для сервиса ротации прокси (самописного)

saver

Назначение

Cохранять структурированно скаченные файлы в зависимости от даты и времени в формате:
{базовая_папка}/год/месяц/день/час/путь

Установка:

pip install mangust228[saver]

Пример использования:

from mangust228.saver import AsyncSaveManager, SyncSaveManager

saver = AsyncSaveManager(base_path="example", compress=True)
# Первый аргумент - контент str, все последующие: то что добавить к названию
path = await saver.save_html("this is content", "seller_id", 4, 5)
print(path)  # "example/2024/05/29/22/seller_id_4_5.html.xz"

Для Синхронного метода методы аналогичные, только без await

Возможные аргументы

  • base_path: str Начальная папка в которую будет все сохраняться
  • add_uuid: bool Добавить случайные символы в конце(на самом деле используется nanoid)
  • compress: bool Сжать ли документ в формат .xz
  • debug: bool Отображать ли логи

ua

Назначение

Ротация user-agent. Мне не очень нравятся другие библиотеки из за устаревших ua.

Установка:

pip install mangust228[ua]

Пример использования:

# get Random User-Agent
UaRandom.web()
# get User-Agent like Chrome
UaRandom.web("chrome") 
# get User-Agent like Firefox
UaRandom.web("firefox")
# get User-Agent like Safari
UaRadom.web("safari")

repo

Назначение

Фабрика и Базовый репозиторий для выполнения CRUD операция

Установка:

pip install mangust228[repo]

Пример использования:

from mangust228.utils.repo import AsyncBaseRepo, AsyncBaseRepoFactory

# Модель алхимии
class UserModel(Base): 
    name: Mapped[str]
    surname: Mapped[str]

class UserRepo(AsyncBaseRepo[UserModel]):
    model = UserModel

    # Кастомный метод для работы с моделью
    async def do_something(self):
        stmt = select().where()
        self.session.execute(stmt)
        return 42

class Repository(AsyncBaseRepoFactory):
    session = session_maker # Объект SQLAlchemy 
    # Добавить кол-во репозиториев можно сколько угодно.
    user: UserRepo  
    another_repo: AnotherRepo 

async with Repository() as repo:
    user_model = UserModel(name="Sergey", surname="Sergeevich") # >> None 
    user = await repo.user.add_by_model(user_model) # Добавить в сессию модель

    await repo.user.add_by_kwargs(name="Ivan", surname="Ivanov") # >> UserModel

    # Удаляет по фильтру
    await repo.user.delete(name="Ivan") # >> int (Количество удаленных строк) 

    # Обновить по id (Модель должна содержать поле id!)
    await repo.user.update_by_id(id=5) # >> UserModel | None

    # Получить одного удовлетворящего условиям
    await repo.user.get_one_or_none(id=2, name="Sergey") # >> UserModel | None

    # Получить много моделей по фильтру. Можно передать limit and offset
    await repo.user.get_many(limit=5, name="Ivan") # list[UserModel]

    # Получить кол-во записей, удовлетворяющих условию(можно не передавать условия)
    await repo.user.count(surname="Petrov") # int (Кол-во Петровых) 

Аргументы которые можно передать в Repository():

  • commit (default: True): Сохраянть ли изменения, если использовать только GET, то можно поставить False
  • debug (default: False): Выводить логи
  • kwargs Аргументы которые передатутся в сессию

proxy

Назначение

Методы для работы с собственным сервисом ротации проксей

Установка:

pip install mangust228[proxy]

Пример использования:

from mangust228.proxy import SyncProxyManager, AsyncProxyManager

with SyncProxyManager() as pm:
    # Получить прокси
    proxy_1: ProxySchema = pm.get() 

    # Поменять прокси, если была вызвана ошибка 
    proxy_2: ProxySchema = pm.change_with_error(new_proxy, reason="just a test")

    # Поменять прокси, просто для профилактики
    proxy_3: ProxySchema = pm.change_without_error(new_proxy)

    # Освободить прокси 
    pm.free(proxy_3) 

async with AsyncProxyManager as pm: 
    proxy = await pm.get() # Методы аналоичные


# атрибуты объекта proxy: 
proxy.req_conn # формат, который подходит для вставки в requests или httpx
proxy.pw_conn # формат, который подходит для вставки в playwright   

Переменные окружения

PROXY_SERVICE_URL=http://100.100.100.100 # IP на котором сервис ротации
PROXY_SERVICE_API_KEY=SUPER_SECRET_API_KEY # API ключ 
PROXY_SERVICE_SERVICE_NAME=test # Сервис который парсим
PROXY_SERVICE_SERVICE_ID=1 # id сервиса который парсим 
PROXY_SERVICE_LOCK_TIME=300 # На сколько замораживаем прокси (в сек.) 

# not required
PROXY_SERVICE_LOGIC=linear # Алгоритм вычисления блокировки прокси
PROXY_SERVICE_LOGIC_BASE_TIME=10 # Базовое время блокировки (см. доку по сервису Ротации)
PROXY_SERVICE_IGNORE_HOURS=24 # см. доку по сервису Ротации
PROXY_SERVICE_TYPE_ID=1 # Тип прокси 1 - IPv4
PROXY_SERVICE_LOCATION_ID=1 # Геолокация 1 - Россия 

parsed

Назначение

Отслеживать, что спарсил, а что нет.

Установка:

pip install mangust228[parsed]

Пример использования:

from parsed_manager import AsyncParsedManager as ParsedManager

# Добавить в неудачно спарсенные
await ParsedManager.wrong.add("url/path", reason) 

# Добавить в те что удачно спарсились 
await ParsedManager.success.add("url/path")  

# Проверить, есть ли в неудачно спарсенных, 
if ParsedManager.wrong.is_exist("url/path"):
    pass  # This block is executed if the URL/path has been parsed before.

Для Синхронного метода методы аналогичные, только без await

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mangust228-0.8.25.tar.gz (17.9 kB view details)

Uploaded Source

Built Distribution

mangust228-0.8.25-py3-none-any.whl (25.3 kB view details)

Uploaded Python 3

File details

Details for the file mangust228-0.8.25.tar.gz.

File metadata

  • Download URL: mangust228-0.8.25.tar.gz
  • Upload date:
  • Size: 17.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for mangust228-0.8.25.tar.gz
Algorithm Hash digest
SHA256 2f51161d0e910f01bc2fd061d2a8beb29388e65adff4263227f47d34e71e526e
MD5 3412e645ce7248a0da66aa418e3d79f1
BLAKE2b-256 e8bdb289ce75ca857a72b193d296deb78bbe92d97fad77988fef9ecccfec94dc

See more details on using hashes here.

File details

Details for the file mangust228-0.8.25-py3-none-any.whl.

File metadata

  • Download URL: mangust228-0.8.25-py3-none-any.whl
  • Upload date:
  • Size: 25.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for mangust228-0.8.25-py3-none-any.whl
Algorithm Hash digest
SHA256 990e3d524fd823bb9892fd67bfca67e671ce0cf9081742f5577bfcdea80b2f2a
MD5 41a9d649548d8666a522f73a93231866
BLAKE2b-256 f67c99e88773be815b5390e699787ea5741e33eeef68d48af101e5e1a51331c5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page