Kodduu Python
1.08K subscribers
311 photos
28 videos
187 links
Научись программировать на Python на интересных примерах

Самый быстрый курс https://stepik.org/a/187914
Самый нескучный курс https://stepik.org/a/185238

Во вопросам сотрудничества: @AlexErf
Download Telegram
Давай сделаем демо-защиту сайта от парсинга, как это делает Ozon, Wildberries, и др. Подходы можно условно разделить на несколько уровней:

🛡️ Пример демо-сайта с защитой от парсинга (на Flask)

📦 Установка:

pip install flask



🔐 Основные защиты:
1. Проверка User-Agent (отсекаем ботов типа `python-requests`)
2. Проверка Referer
3. Проверка на отсутствие JavaScript (через `JS challenge`)
4. Блокировка по IP при подозрительных действиях (anti-flood)


🧠 Код server.py:

from flask import Flask, request, abort, render_template_string
import time

app = Flask(__name__)

# Простейший анти-flood: IP -> время последнего запроса
last_access = {}

HTML_PAGE = """
<!DOCTYPE html>
<html>
<head>
<title>Demo Page</title>
<script>
// JS Challenge: ставим куку
document.cookie = "js_enabled=1";
</script>
</head>
<body>
<h1>Добро пожаловать!</h1>
<p>Цены на товары: 199₽, 299₽, 399₽</p>
</body>
</html>
"""

@app.route('/')
def home():
ip = request.remote_addr
ua = request.headers.get('User-Agent', '')
referer = request.headers.get('Referer', '')
cookies = request.cookies

# 1. Блокируем подозрительные юзер-агенты
if 'python-requests' in ua.lower() or 'httpclient' in ua.lower():
abort(403, "Парсинг запрещен: подозрительный User-Agent")

# 2. Проверка на спам/флуд
now = time.time()
if ip in last_access and (now - last_access[ip] < 2):
abort(429, "Слишком много запросов. Подозрение на бота.")
last_access[ip] = now

# 3. Проверка на наличие JS (через куку)
if cookies.get('js_enabled') != '1':
return '''
<html>
<head><title>Подождите...</title>
<meta http-equiv="refresh" content="1">
<script>document.cookie = "js_enabled=1";</script>
</head>
<body>Проверка браузера...</body></html>
'''

return render_template_string(HTML_PAGE)

if __name__ == '__main__':
app.run(debug=True)


🔍 Как работает защита:

| Защита | Объяснение |
|--------|------------|
| User-Agent | Отсекает requests, curl и пр. |
| JS cookie | Бот не выполнит JavaScript и не получит доступ |
| Flood-защита | Запросы чаще чем раз в 2 сек — блокируются |
| Referer check (не используется, но можно) | Можно блокировать прямой доступ без перехода с сайта |


⚔️ Как обойти эту защиту

Ты можешь протестировать защиту, написав парсер на requests, и увидишь 403.
Чтобы обойти:

- использовать selenium или Playwright
- добавить cookie js_enabled=1
- имитировать User-Agent, Referer, Delay

Подпишись 👉🏻 @KodduuPython 🤖
Самый полная вечно зеленая программа по Python 🍏🍏🍏 со скидкой 💰💵💸

Подпишись 👉🏻 @KodduuPython 🤖
Пример промта для создания интернет-магазина с нуля. Этот промт можно использовать для генерации дизайна и функционала сайта.

---

Пример промта для создания интернет-магазина:

"Создать интернет-магазин с нуля для продажи различных товаров, таких как одежда, электроника и аксессуары. Дизайн должен быть современным, простым и интуитивно понятным, с фокусом на удобство пользователей. Необходимо включить следующие разделы и функциональность:

1. Главная страница:
- Привлекательный баннер с текущими скидками или акциями.
- Разделы для популярных товаров и новинок.
- Блок с отзывами покупателей.
- Меню с категориями товаров (Одежда, Электроника, Аксессуары и т.д.).
- Интерактивный поиск товаров по ключевым словам.

2. Каталог товаров:
- Фильтрация по категориям, брендам, цене и рейтингу.
- Возможность сортировки товаров по популярности, цене, новизне и скидке.
- Страница каждого товара с подробным описанием, изображениями, опциями (размер, цвет), кнопкой добавления в корзину.

3. Корзина покупок:
- Просмотр выбранных товаров, количества и общей суммы.
- Возможность редактировать количество или удалить товар.
- Опции для оформления заказа (доставка, оплата).

4. Оформление заказа:
- Ввод данных пользователя (имя, адрес, телефон).
- Выбор способа доставки и оплаты.
- Подтверждение заказа с деталями.

5. Аккаунт пользователя:
- Регистрация, вход и восстановление пароля.
- Личный кабинет с историей заказов, отслеживанием статуса.
- Возможность сохранения избранных товаров.

6. Интеграция с платежными системами:
- Подключение популярных способов оплаты (кредитные карты, PayPal, и т.д.).

7. Мобильная версия сайта:
- Оптимизация для мобильных устройств с адаптивным дизайном.

8. SEO-оптимизация:
- Основные страницы сайта должны быть оптимизированы для поисковых систем (заголовки, мета-теги, URL).

9. Безопасность:
- Внедрение HTTPS для защиты данных пользователей.
- Поддержка 2FA для входа в личный кабинет.

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

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

---

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

Подпишись 👉🏻 @KodduuPython 🤖
4👍1
🐍 Как превратить текст в JSON за 5 строк кода

Хотите быстро извлекать структурированные данные (имя, email, интересы) из свободного текста? Например, когда пользователь пишет что-то вроде:

> *«Меня зовут Алекс, мой email — [email protected], интересуюсь ML и астрономией»*

Вот как это сделать с помощью LLM (например, OpenAI GPT) и Python:


import openai
import json

def extract_info(text: str) -> dict:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "Извлеки имя, email и интересы из текста. Верни JSON."},
{"role": "user", "content": text}
]
)
return json.loads(response.choices[0].message.content)

# Пример использования
user_input = "Я Катя, пиши на [email protected], люблю Python и нейросети!"
print(extract_info(user_input))


Вывод:

{
"name": "Катя",
"email": "[email protected]",
"interests": ["Python", "нейросети"]
}


Где пригодится?
- Чат-боты: парсим запросы пользователей.
- CRM: автоматически заполняем карточки клиентов.
- Формы: даже если человек ввёл данные в свободном формате, система их поймёт.

Подпишись 👉🏻 @KodduuPython 🤖
👍31
Вышла новая статья "Как сделать RAG для своей компании" на HABR 👏

Больше данных по разработке нашей RAG и ИИ-агентам в канале @aigentto ⚡️
🐍 Python: Как работает `__slots__` и зачем он нужен

Когда вы создаёте класс в Python, по умолчанию каждый его экземпляр хранит атрибуты в словаре __dict__. Это удобно, но не всегда эффективно по памяти. Если вы создаёте много однотипных объектов, можно оптимизировать их с помощью __slots__.


class Point:
__slots__ = ('x', 'y')

def __init__(self, x, y):
self.x = x
self.y = y


📌 Что делает __slots__?

- Ограничивает набор допустимых атрибутов.
- Убирает __dict__, экономя память.
- Ускоряет доступ к атрибутам.

📊 Сравнение:


import sys

class Default:
def __init__(self):
self.a = 1
self.b = 2

class Slotted:
__slots__ = ('a', 'b')
def __init__(self):
self.a = 1
self.b = 2

print(sys.getsizeof(Default())) # Примерно 56 байт
print(sys.getsizeof(Slotted())) # Примерно 40 байт


⚠️ Важно:

- __slots__ не наследуются автоматически.
- Нельзя добавлять новые атрибуты вне указанных в __slots__.

Используйте __slots__, когда нужно создать множество однотипных объектов и важно сэкономить память.

Подпишись 👉🏻 @KodduuPython 🤖
👍1
Майские лучшее время начать курс с преподавателями Профессия Python-разработчик.

Реклама. Информация о рекламодателе по ссылкам в посте.
🐍 Магия дескрипторов в Python: кастомные валидаторы полей

Если ты когда-нибудь валидировал поля в классе, то, возможно, делал это вручную в __init__. Но Python даёт куда более мощный механизм — дескрипторы.

Создадим дескриптор, который будет валидировать возраст:


class PositiveInteger:
def __init__(self, name):
self.name = name

def __get__(self, instance, owner):
return instance.__dict__[self.name]

def __set__(self, instance, value):
if not isinstance(value, int):
raise TypeError(f"{self.name} must be an integer")
if value < 0:
raise ValueError(f"{self.name} must be >= 0")
instance.__dict__[self.name] = value


Теперь можно использовать его в классе:


class User:
age = PositiveInteger("age")

def __init__(self, name, age):
self.name = name
self.age = age


Работает:


u = User("Alice", 30)
print(u.age) # 30


🚫 Не работает:


u = User("Bob", -5) # ValueError
u = User("Charlie", "12") # TypeError


📌 Что происходит:

- User.age — это не обычное поле, а объект-дескриптор.
- При установке значения вызывается __set__.
- Это даёт гибкий контроль: можно валидировать, логировать, кэшировать и т.д.

Подпишись 👉🏻 @KodduuPython 🤖
👍2
Forwarded from AIGENTTO
Попробовал генерацию видео аватаров. С помощью Python библиотек SadTalker, Wav2Lip, и еще одной магической библиотеки.
Попробуйте определить где живой человек, а где генерация

Генерация на локальном MacBook M3, минут 20 занимает за 8 секунд видео. В облаке на GPU в сотни раз быстрее.

Очень увлекательно, но теперь думаю - а как это применить в бизнесе? С RAG, ИИ-агентами применение понятно, а тут? 🤔

Подпишись 👉🏻 @aigentto 🤖
Вот простой скрипт на Python, который удаляет скрытые/невидимые символы (включая неразрывные пробелы и прочие ватермарки в виде специальных символов Unicode) из текстов, сгенерированных ИИ:


import re
import unicodedata

# Список подозрительных символов, часто используемых как "водяные знаки"
# Включает неразрывный пробел, zero width space, и другие невидимые символы
WATERMARK_CHARS = [
'\u00A0', # Неразрывный пробел (non-breaking space)
'\u200B', # Zero width space
'\u200C', # Zero width non-joiner
'\u200D', # Zero width joiner
'\u2060', # Word joiner
'\uFEFF', # Zero width no-break space (BOM)
]

def clean_ai_watermarks(text: str) -> str:
# Удаляем все подозрительные символы
for char in WATERMARK_CHARS:
text = text.replace(char, '')

# Дополнительно можно убрать все невидимые символы из категорий Cf, Cc
text = ''.join(
ch for ch in text if unicodedata.category(ch) not in ('Cf', 'Cc')
)

# Или можно воспользоваться регуляркой:
# text = re.sub(r'[\u200B\u200C\u200D\u2060\uFEFF\u00A0]', '', text)

return text

# Пример использования
if __name__ == "__main__":
original = "Это\u00A0пример\u200Bтекста\u2060с\uFEFFневидимыми\u200Dсимволами."
print("До очистки:")
print(repr(original))
cleaned = clean_ai_watermarks(original)
print("\nПосле очистки:")
print(repr(cleaned))


### Что делает скрипт:

* Удаляет все основные невидимые символы (часто используемые как watermark).
* Можно расширить список WATERMARK_CHARS, если появятся новые подозрительные символы.

Для чего это нужно читайте здесь 👈👈👈

Подпишись 👉🏻 @aigentto 🤖
🧠 Визуализация работы сортировки прямо в реальном времени!

Мини-скрипт на Python, который показывает, как пузырьковая сортировка двигает элементы.


import random
import time
import os

def visualize(arr):
os.system('cls' if os.name == 'nt' else 'clear')
for num in arr:
print('█' * num)
time.sleep(0.05)

arr = [random.randint(1, 50) for _ in range(30)]

for i in range(len(arr)):
for j in range(len(arr) - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
visualize(arr)


📌 Этот код сортирует массив из случайных чисел пузырьком и в реальном времени показывает, как перемещаются элементы, используя «█» в консоли.

Без сторонних библиотек. Работает в любом терминале.

Подпишись 👉🏻 @KodduuPython 🤖
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Видео по коду выше 👆👆👆

Подпишись 👉🏻 @KodduuPython 🤖
🧩 Мини-решатель судоку за 20 строк!

Рабочий скрипт на Python, который решает любое корректное поле судоку через рекурсивный бэктрекинг.


def solve(board):
for i in range(9):
for j in range(9):
if board[i][j] == 0:
for n in range(1, 10):
if valid(board, i, j, n):
board[i][j] = n
if solve(board):
return True
board[i][j] = 0
return False
return True

def valid(board, r, c, n):
row = all(board[r][i] != n for i in range(9))
col = all(board[i][c] != n for i in range(9))
box = all(board[r//3*3+i//3][c//3*3+i%3] != n for i in range(9))
return row and col and box

board = [
[5,3,0,0,7,0,0,0,0],
[6,0,0,1,9,5,0,0,0],
[0,9,8,0,0,0,0,6,0],
[8,0,0,0,6,0,0,0,3],
[4,0,0,8,0,3,0,0,1],
[7,0,0,0,2,0,0,0,6],
[0,6,0,0,0,0,2,8,0],
[0,0,0,4,1,9,0,0,5],
[0,0,0,0,8,0,0,7,9]
]

solve(board)
for row in board:
print(row)


📌 Этот код решает судоку с помощью бэктрекинга без библиотек. Минималистичная, быстрая и полностью рабочая версия.

Без зависимостей. Просто скопировать и запустить.

Подпишись 👉🏻 @KodduuPython 🤖
1
📚 Как за минуту распарсить огромный CSV-файл размером в гигабайты без загрузки в память!

Когда файл влезает в оперативку — всё легко. Но если файл 10+ ГБ?
Тогда надо читать его построчно, аккуратно обрабатывать и не уронить машину.

Вот рабочий скрипт:


import csv

def process_row(row):
# Здесь твоя логика обработки
if int(row['price']) > 1000:
print(f"{row['name']} стоит {row['price']}")

with open('bigfile.csv', newline='', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
process_row(row)


📌 Этот код обрабатывает гигабайтные CSV-файлы без переполнения памяти.
Файл читается построчно через csv.DictReader, без полной загрузки в память.
Функция process_row позволяет применить любую бизнес-логику к данным.

📦 Ничего устанавливать не надо — только стандартная библиотека Python.

---

Реальная сложность задачи:
- Оперативная память ограничена: файл нельзя просто pandas.read_csv().
- Нужно обрабатывать миллионы строк быстро и без потерь.
- Требуется минимальное потребление памяти, чтобы не убить сервер/ноутбук.

Подпишись 👉🏻 @KodduuPython 🤖
👍3
Все еще можно успеть на поезд "Старт курса с преподавателем на Майские". Начать можно и после майских 👉 Профессия Python-разработчик.

Реклама. Информация о рекламодателе по ссылкам в посте.