Салам пиплы, сегодня Я (с большой буквы) покажу вам скрипт для скачивания ответов из сайта gdz.ru
Подготовка
Весь скрипт написан на python и для запуска скрипта понадобится скачать его из офиц сайта.
После скачивания питона создаём папку с проектом и в нём файл main.py
Открываем main.py через любой IDE (для любителей гей порно, можно через блокнот)
Шаг 1. Импортируем либы
Шаг 2. Пишем функции
Шаг 3. Точка входа
Шаг 4. Запускаем
В терминал пишем:
Он у нас запросит URL, он должен быть такого формата:
далее указываем страницу с которой начинать и завершить.
Теперь нужно ввести формат ссылки для парсинга. В gdz.ru в зависимости от учебника он разный.
К примеру, если ответ находится на странице
Подготовка
Весь скрипт написан на python и для запуска скрипта понадобится скачать его из офиц сайта.
После скачивания питона создаём папку с проектом и в нём файл main.py
Открываем main.py через любой IDE (для любителей гей порно, можно через блокнот)
Шаг 1. Импортируем либы
Python:
import os
import aiohttp
import asyncio
from bs4 import BeautifulSoup
from rich.console import Console
from rich.progress import Progress, TaskID
Шаг 2. Пишем функции
Python:
# Создаем консоль для вывода
console = Console()
async def fetch_page(session, url):
"""Асинхронное получение страницы."""
try:
async with session.get(url) as response:
response.raise_for_status()
return await response.text()
except Exception as e:
console.log(f"[red]Ошибка при скачивании страницы {url}: {e}[/red]")
return None
async def download_image(session, img_url, file_path):
"""Асинхронное скачивание изображения."""
try:
async with session.get(img_url) as response:
response.raise_for_status()
img_data = await response.read()
with open(file_path, "wb") as img_file:
img_file.write(img_data)
console.log(f"[green]Сохранено:[/green] {file_path}")
except Exception as e:
console.log(f"[red]Ошибка при скачивании изображения {img_url}: {e}[/red]")
async def process_page(session, page, base_url, format_pages, output_dir, progress, task_id: TaskID):
"""Обработка страницы: скачивание изображений."""
# Формируем URL страницы на основе формата
page_url = f"{base_url}{format_pages.format(page=page)}"
console.log(f"Получаем данные из: [blue]{page_url}[/blue]")
page_content = await fetch_page(session, page_url)
if not page_content:
progress.update(task_id, advance=1)
return 0
soup = BeautifulSoup(page_content, "html.parser")
task_containers = soup.find_all("div", class_="task-img-container")
image_count = 0
for container in task_containers:
img_tag = container.find("img")
if img_tag and "src" in img_tag.attrs:
img_url = img_tag["src"]
# Обработка URL (полный или относительный)
if not img_url.startswith("http"):
img_url = f"https:{img_url}"
image_count += 1
file_suffix = f" ({image_count})" if image_count > 1 else ""
filename = f"Страница {page}{file_suffix}.jpg"
file_path = os.path.join(output_dir, filename)
await download_image(session, img_url, file_path)
progress.update(task_id, advance=1)
return image_count
async def download_images(base_url, start_page, end_page, format_pages):
output_dir = "out"
# Создаем директорию для сохранения изображений
os.makedirs(output_dir, exist_ok=True)
console.print(f"[bold]Таргет ссылка:[/bold] {base_url}")
console.print(f"[bold]Скачиваем страницы с {start_page} по {end_page}[/bold]")
total_pages = end_page - start_page + 1
total_images = 0
async with aiohttp.ClientSession() as session:
with Progress(console=console) as progress:
task_id = progress.add_task("[cyan]Скачивание страниц...[/cyan]", total=total_pages)
tasks = [
process_page(session, page, base_url, format_pages, output_dir, progress, task_id)
for page in range(start_page, end_page + 1)
]
results = await asyncio.gather(*tasks)
total_images = sum(results)
console.print(f"[bold green]Скачивание завершено![/bold green]")
console.print(f"[bold]Скачано страниц:[/bold] {total_pages}")
console.print(f"[bold]Скачано изображений:[/bold] {total_images}")
Шаг 3. Точка входа
Python:
if __name__ == "__main__":
base_url = input('Введите URL для скачивания: ')
start_page = int(input('Введите страницу, с которой нужно начинать парсинг: '))
end_page = int(input('Введите страницу, на которой нужно завершить парсинг: '))
format_pages = input('Введите формат страницы (например: "task-{page}", "{page}-s"): ')
asyncio.run(download_images(base_url, start_page, end_page, format_pages))
В терминал пишем:
python3 main.py
Он у нас запросит URL, он должен быть такого формата:
You must be registered for see links
(ссылка на учебник!!!)далее указываем страницу с которой начинать и завершить.
Теперь нужно ввести формат ссылки для парсинга. В gdz.ru в зависимости от учебника он разный.
К примеру, если ответ находится на странице
You must be registered for see links
То получается наш формат это: {page}-s
You must be registered for see images attach