сделай этот код на питоне самым функциональным и современным, что бы его цена возросла в тысячи раз:
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin
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
Для того чтобы сделать этот код более функциональным и современным, можно использовать несколько подходов и библиотек. Вот улучшенная версия кода:
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())
Асинхронное программирование:
aiohttp
для асинхронных HTTP-запросов.asyncio
для управления асинхронными задачами.Логирование:
Обработка ошибок:
Современные подходы:
os.makedirs
с параметром exist_ok=True
для создания папок.asyncio.gather
для параллельного выполнения задач.Этот код более производителен и надежен, что делает его более ценным и