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
Продолжает пилить RAG системы и ИИ-Агентов 🔥🔥🔥
Forwarded from AIGENTTO
На картинках структуры проектов 1,2,3 и тестирование fallback в п.3 🔨

Подпишись 👉🏻 @aigentto 🤖
Автоматическая генерация тестов / карточек для обучения на основе любого текста 📚

🧠 Пример: Генерация обучающих карточек (вопрос–ответ) из статьи

Ты подаёшь модели текст (например, описание из Wikipedia, документацию, лекцию), а она создаёт flashcards или тестовые вопросы с ответами.


import openai
import json

openai.api_key = "your-api-key"

def generate_flashcards_from_text(text, num_questions=5):
system_prompt = (
"Ты генератор обучающих карточек. Получив текст, создай краткие вопросы и ответы "
"в формате JSON: список объектов с 'question' и 'answer'. "
f"Сделай примерно {num_questions} карточек. Без вымышленных фактов."
)

messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": text}
]

response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages
)

content = response.choices[0].message.content

try:
cards = json.loads(content)
except Exception as e:
print("Ошибка при разборе JSON:", e)
cards = {"raw": content}

return cards

# Примерный текст для генерации карточек
example_text = """
Большой язык модели (LLM) — это нейросетевая архитектура, обученная на огромных массивах текстов для обработки и генерации естественного языка.
Они основаны в основном на трансформерах и могут использоваться для задач перевода, обобщения, генерации кода, ведения диалогов и других.
"""

flashcards = generate_flashcards_from_text(example_text)

# Красивый вывод
for i, card in enumerate(flashcards, 1):
print(f"{i}. {card['question']}\n {card['answer']}\n")


📦 Где можно применить:
- Создание учебных карточек (аналог Anki) из любых документов.
- Генерация квизов для студентов.
- Автоматическая проверка знаний по документации.
- Подготовка технических интервью / тестов.

🔄 Вариации:
- Попросить LLM создавать несколько вариантов ответа.
- Создавать краткие объяснения к каждому ответу.
- Встраивать генерацию карточек в LMS или Slack-бота.

Подпишись 👉🏻 @KodduuPython 🤖
👍2
Вот универсальный шаблон Python-кода для парсинга сайтов, где:

- используется requests или selenium (если сайт с JavaScript),
- применён BeautifulSoup для разбора HTML,
- предусмотрена работа с пагинацией, заголовками, прокси и user-agent'ами.

💡 Если сайт не требует JavaScript (т.е. HTML доступен сразу):

import requests
from bs4 import BeautifulSoup
import random
import time

# Примеры user-agents
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...'
]

HEADERS = {
'User-Agent': random.choice(USER_AGENTS)
}

def get_html(url):
try:
response = requests.get(url, headers=HEADERS, timeout=10)
response.raise_for_status()
return response.text
except requests.RequestException as e:
print(f"Ошибка запроса: {e}")
return None

def parse_page(html):
soup = BeautifulSoup(html, 'html.parser')
# Найти нужные элементы
titles = soup.select('h2.article-title a')
for title in titles:
print(title.text.strip(), '->', title['href'])

def main():
base_url = 'https://example.com/news?page='
for page in range(1, 6): # первые 5 страниц
url = base_url + str(page)
html = get_html(url)
if html:
parse_page(html)
time.sleep(random.uniform(1, 3)) # не спамим сервер

if __name__ == '__main__':
main()


🧠 Если сайт требует JavaScript — используем selenium:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

def init_driver():
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(options=options)
return driver

def parse_dynamic_site(url):
driver = init_driver()
try:
driver.get(url)
time.sleep(3) # дать JS прогрузиться

soup = BeautifulSoup(driver.page_source, 'html.parser')
items = soup.select('.product-card-title')
for item in items:
print(item.text.strip())
finally:
driver.quit()

if __name__ == '__main__':
parse_dynamic_site("https://example.com/dynamic-products")


Подпишись 👉🏻 @KodduuPython 🤖
1
Сайт ozon.ru защищён от обычного парсинга — там используется динамическая загрузка контента через JavaScript, и, к тому же, у них настроена защита от ботов (Cloudflare). Поэтому простой requests или BeautifulSoup работать не будет. Но есть два способа:

🔧 Способ 1: Selenium (рекомендован для обхода JS и защиты)

Вот пример, как с помощью selenium получить цену товаров с Ozon:

### Установи зависимости:

pip install selenium webdriver-manager


### Код:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time

def init_driver():
options = Options()
options.add_argument('--headless') # не отображать окно
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--disable-blink-features=AutomationControlled') # анти-бот
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)...')

driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
return driver

def parse_ozon_prices(search_query="ноутбук"):
driver = init_driver()
try:
query = search_query.replace(" ", "+")
url = f"https://www.ozon.ru/search/?text={query}"
driver.get(url)

time.sleep(5) # подождать загрузку JS

products = driver.find_elements(By.CSS_SELECTOR, 'div[data-widget="searchResultsV2"] div[data-widget="searchResultsV2"]')
if not products:
print("Товары не найдены.")
return

cards = driver.find_elements(By.CSS_SELECTOR, 'div[data-widget="searchResultsV2"] div.b0e6a')
for card in cards[:10]: # первые 10 товаров
try:
name = card.find_element(By.CSS_SELECTOR, 'span.tsBody500').text
price = card.find_element(By.CSS_SELECTOR, 'span[style*="font-weight: 700"]').text
print(f"{name} — {price}")
except Exception as e:
continue

finally:
driver.quit()

if __name__ == "__main__":
parse_ozon_prices("смартфон")


## 🧪 Способ 2: API через перехват трафика (сложнее, но стабильнее)

Можно открыть DevTools (F12 → вкладка Network → XHR) на Ozon, найти запрос к API типа:

https://www.ozon.ru/api/composer-api.bx/page/json/v2?url=/search/?text=...

и использовать requests с нужными headers и cookies.

Но такой подход требует детальной настройки (передачи токенов, cookies, UA), и Ozon часто меняет структуру.


Вывод

Если хочешь протестировать прямо сейчас — используй Selenium.
Если нужно собрать много данных — лучше использовать обход с API, но он сложнее.

⚠️ Код приведен для демонстрации подхода, промышленный парсер может быть сложнее ⚠️

Подпишись 👉🏻 @KodduuPython 🤖
👍4
Хочешь быстро освоить Python и сделать первые шаги в Data Science? Простой и понятный курс, с практикой и поддержкой.

Начни учиться учится сегодня 👉👉👉 Junior Python Data Scientist на Stepik 🔥🔥🔥

Подпишись 👉🏻 @KodduuPython 🤖
Пример API-парсера для Ozon.ru, который симулирует запрос, аналогичный тому, что делает сайт при поиске товара. Мы будем:

1. Подставлять поисковый текст (`?text=...`)
2. Делать запрос к Ozon API (скрытый, но публичный)
3. Вытаскивать имена и цены товаров

---

⚙️ Установка зависимостей

pip install requests


---

🧩 Код API-парсера:

import requests
import json

def get_ozon_products(search_query, page=1):
url = "https://www.ozon.ru/api/composer-api.bx/page/json/v2"

headers = {
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept": "application/json",
}

payload = {
"url": f"/search/?text={search_query}&page={page}"
}

response = requests.post(url, headers=headers, json=payload)

if response.status_code != 200:
print(f"Ошибка запроса: {response.status_code}")
return []

try:
data = response.json()
items = []

widgets = data.get("widgetStates", {})
for k, v in widgets.items():
if k.startswith("searchResultsV2"):
items_json = json.loads(v).get("items", [])
for item in items_json:
title = item.get("cellTrackingInfo", {}).get("title", "")
price_raw = item.get("cellTrackingInfo", {}).get("price", {}).get("price", "")
price = f"{price_raw} ₽" if price_raw else "Цена не указана"
items.append((title, price))
break
return items

except Exception as e:
print("Ошибка при разборе JSON:", e)
return []

# Пример использования
if __name__ == "__main__":
products = get_ozon_products("ноутбук", page=1)
for name, price in products:
print(f"{name} — {price}")


---

🔐 Примечания

- Запрос к https://www.ozon.ru/api/composer-api.bx/page/json/v2 работает без авторизации, но может сломаться, если Ozon поменяет API.
- Ozon сильно рандомизирует ID-шники в JSON. Поэтому мы ищем нужный ключ через префикс searchResultsV2.
- Можно обойтись без cookies — всё работает как обычный пользователь.

⚠️ Код приведен для демонстрации подхода, промышленный парсер может быть сложнее ⚠️

Подпишись 👉🏻 @KodduuPython 🤖
👍3
Давай сделаем демо-защиту сайта от парсинга, как это делает 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 ⚡️