Парсим ответы из gdz.ru

Любимец пользователей
Салам пиплы, сегодня Я (с большой буквы) покажу вам скрипт для скачивания ответов из сайта 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))
Шаг 4. Запускаем
В терминал пишем:
python3 main.py
Он у нас запросит URL, он должен быть такого формата:
(ссылка на учебник!!!)
далее указываем страницу с которой начинать и завершить.
Теперь нужно ввести формат ссылки для парсинга. В gdz.ru в зависимости от учебника он разный.
К примеру, если ответ находится на странице
То получается наш формат это: {page}-s

You must be registered for see images attach

 
Менеджер форума DevCore для души!
можно ботика сделать в телеграм
 
Top