Enhancing Python Code with Asynchronous Programming and Logging

Answered using ChatGPT 4o by ChatGPT4o

Question:

сделай этот код на питоне самым функциональным и современным, что бы его цена возросла в тысячи раз:

import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin

URL сайта, который нужно клонировать

base_url = 'https://zelenka.guru'

Папка, куда будут сохраняться файлы

output_folder = 'cloned_site'

Создаем папку, если она не существует

if not os.path.exists(output_folder): os.makedirs(output_folder)

def save_page(url, folder): response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') # Сохраняем HTML файл file_path = os.path.join(folder, 'index.html') with open(file_path, 'w', encoding='utf-8') as file: file.write(soup.prettify()) print(f'Saved {url} to {file_path}') # Скач��ваем и сохраняем все ссылки на ресурсы (CSS, JS, изображени��) for tag in soup.find_all(['link', 'script', 'img']): src

Answer:

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

  1. Использование асинхронного программирования для повышения производительности.
  2. Улучшение обработки ошибок.
  3. Добавление логирования.
  4. Использование современных библиотек и подходов.
import os
import aiohttp
import asyncio
import logging
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse

# Настройка логирования
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# URL сайта, который нужно клонировать
base_url = 'https://zelenka.guru'

# Папка, куда будут сохраняться файлы
output_folder = 'cloned_site'

# Создаем папку, если она не существует
os.makedirs(output_folder, exist_ok=True)

async def fetch(session, url):
    try:
        async with session.get(url) as response:
            response.raise_for_status()
            return await response.text()
    except Exception as e:
        logger.error(f'Error fetching {url}: {e}')
        return None

async def save_file(url, folder, session):
    try:
        async with session.get(url) as response:
            response.raise_for_status()
            content = await response.read()
            parsed_url = urlparse(url)
            file_path = os.path.join(folder, os.path.basename(parsed_url.path))
            os.makedirs(os.path.dirname(file_path), exist_ok=True)
            with open(file_path, 'wb') as file:
                file.write(content)
            logger.info(f'Saved {url} to {file_path}')
    except Exception as e:
        logger.error(f'Error saving {url}: {e}')

async def save_page(url, folder, session):
    html = await fetch(session, url)
    if html:
        soup = BeautifulSoup(html, 'html.parser')
        file_path = os.path.join(folder, 'index.html')
        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(soup.prettify())
        logger.info(f'Saved {url} to {file_path}')

        tasks = []
        for tag in soup.find_all(['link', 'script', 'img']):
            src = tag.get('href') or tag.get('src')
            if src:
                resource_url = urljoin(url, src)
                tasks.append(save_file(resource_url, folder, session))
        await asyncio.gather(*tasks)

async def main():
    async with aiohttp.ClientSession() as session:
        await save_page(base_url, output_folder, session)

if __name__ == '__main__':
    asyncio.run(main())

Объяснение изменений:

  1. Асинхронное программирование:

    • Использование aiohttp для асинхронных HTTP-запросов.
    • Использование asyncio для управления асинхронными задачами.
  2. Логирование:

    • Добавлено логирование для отслеживания процесса и ошибок.
  3. Обработка ошибок:

    • Добавлена обработка исключений для HTTP-запросов и операций с файлами.
  4. Современные подходы:

    • Использование os.makedirs с параметром exist_ok=True для создания папок.
    • Использование asyncio.gather для параллельного выполнения задач.

Этот код более производителен и надежен, что делает его более ценным и