
Python предоставляет несколько библиотек для получения HTML-кода веб-страниц. Самый распространённый способ – использовать модуль requests. Он позволяет отправлять HTTP-запросы и получать содержимое страницы в виде строки. Например, вызов requests.get(‘URL’).text возвращает полный HTML-документ целевой страницы.
Для анализа и обработки полученного HTML удобно применять BeautifulSoup из пакета bs4. Эта библиотека позволяет извлекать конкретные элементы, такие как заголовки, ссылки или таблицы, без необходимости вручную парсить текст страницы.
При работе с динамическими сайтами, где контент загружается через JavaScript, стандартный requests не подходит. В таких случаях используют Selenium или Playwright, которые эмулируют браузер и позволяют получать HTML уже после выполнения скриптов на странице.
Сохранение скачанного HTML-файла производится стандартными средствами Python. Достаточно открыть файл в режиме записи (‘w’, encoding=’utf-8′) и записать содержимое страницы. Это создаёт локальную копию, которую можно анализировать или использовать для оффлайн-просмотра.
Как скачать HTML страницу с помощью Python
Для загрузки HTML страницы в Python используют библиотеки requests и httpx. Они позволяют отправлять HTTP-запросы и получать содержимое страницы.
Простейший способ с requests выглядит так:
import requests
url = ‘https://example.com’
response = requests.get(url)
html_content = response.text
Метод get возвращает объект ответа, у которого text содержит HTML код страницы. Если требуется сохранить файл локально, используют:
with open(‘page.html’, ‘w’, encoding=’utf-8′) as f:
f.write(html_content)
Для асинхронной загрузки применяют httpx:
import httpx
async with httpx.AsyncClient() as client:
response = await client.get(url)
html_content = response.text
Важно учитывать кодировку страницы, особенно если она не UTF-8. Requests автоматически определяет кодировку по заголовкам, но при некорректной кодировке можно явно указать:
response.encoding = ‘utf-8’
Если сервер защищён, иногда требуется добавить заголовки, например User-Agent:
headers = {‘User-Agent’: ‘Mozilla/5.0’}
response = requests.get(url, headers=headers)
Для страниц с динамическим контентом, загружаемым через JavaScript, requests не подойдёт. В таких случаях используют Selenium или Playwright для эмуляции браузера и получения итогового HTML.
После получения HTML можно анализировать его с помощью BeautifulSoup или lxml, чтобы извлекать конкретные элементы.
Установка библиотеки requests для загрузки страниц

Для загрузки HTML-страниц в Python удобнее всего использовать библиотеку requests. Она предоставляет простой интерфейс для отправки HTTP-запросов и получения ответов.
Установка выполняется через пакетный менеджер pip. В командной строке используйте команду:
pip install requests
После установки можно проверить версию библиотеки, чтобы убедиться, что установка прошла успешно:
python -m pip show requests
| Команда | Назначение |
|---|---|
pip install requests |
Установка последней версии библиотеки |
pip install requests==2.31.0 |
Установка конкретной версии (например, 2.31.0) |
python -m pip show requests |
Отображение информации о установленной библиотеке |
Для виртуальных окружений рекомендуется сначала создать окружение командой python -m venv env, активировать его и затем устанавливать requests. Это изолирует зависимости проекта и предотвращает конфликты с другими библиотеками.
Скачивание HTML с использованием метода get

Для загрузки HTML страницы в Python часто применяется библиотека requests. Основной метод – get, который выполняет HTTP-запрос и возвращает объект Response.
Простейший пример использования выглядит так:
import requests
url = 'https://example.com'
response = requests.get(url)
html_content = response.text
Метод get автоматически обрабатывает перенаправления и поддерживает указание таймаута.
Рекомендуется всегда задавать таймаут, чтобы избежать зависания при недоступном сервере:
response = requests.get(url, timeout=10)
Для корректного получения страниц с нестандартной кодировкой нужно указать response.encoding перед чтением текста:
response.encoding = 'utf-8'
html_content = response.text
Если сервер требует заголовки, например User-Agent, их передают через словарь headers:
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
Метод get позволяет передавать параметры запроса через params:
params = {'q': 'python', 'page': 1}
response = requests.get('https://example.com/search', params=params)
Для проверки успешного получения страницы используется атрибут status_code. Значение 200 означает успешный ответ:
if response.status_code == 200:
html_content = response.text
Использование get совместно с таймаутом, заголовками и параметрами обеспечивает надежное скачивание HTML без блокировок и ошибок.
Сохранение полученного HTML в локальный файл

После получения HTML-кода с помощью библиотеки requests или httpx, следующий шаг – сохранить его на диск. Это позволяет анализировать страницу оффлайн или использовать её для последующей обработки.
Простейший способ – использовать встроенные функции Python для работы с файлами:
with open("page.html", "w", encoding="utf-8") as file:
file.write(html_content)
page.html– имя файла, можно указать полный путь для сохранения в другой директории.- Аргумент
encoding="utf-8"гарантирует корректное отображение символов на странице. - Использование
withавтоматически закрывает файл после записи.
Если требуется регулярное сохранение нескольких страниц:
- Создайте функцию с параметрами
html_contentиfilename. - Проверяйте наличие файла и добавляйте уникальные суффиксы, чтобы не перезаписать предыдущие версии.
- Для больших страниц можно использовать поблочную запись:
with open("large_page.html", "w", encoding="utf-8") as file:
for chunk in html_content.splitlines():
file.write(chunk + "\n")
Для организации сохранённых страниц удобно создавать отдельную директорию:
import os
os.makedirs("saved_pages", exist_ok=True)
with open("saved_pages/page1.html", "w", encoding="utf-8") as file:
file.write(html_content)
Дополнительно можно сохранять страницы с отметкой времени, чтобы легко отслеживать версии:
from datetime import datetime
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"page_{timestamp}.html"
with open(filename, "w", encoding="utf-8") as file:
file.write(html_content)
Обработка ошибок при недоступности страницы
Для начала следует обернуть запрос в блок try-except. Например, при использовании requests можно отлавливать все сетевые ошибки так:
import requests
try:
response = requests.get('https://example.com', timeout=5)
response.raise_for_status()
except requests.exceptions.HTTPError as e:
print(f'Ошибка HTTP: {e.response.status_code}')
except requests.exceptions.ConnectionError:
print('Сервер недоступен или проблемы с соединением')
except requests.exceptions.Timeout:
print('Превышено время ожидания ответа')
except requests.exceptions.RequestException as e:
print(f'Другая ошибка: {e}')
Рекомендуется устанавливать таймаут для запроса, чтобы скрипт не зависал при недоступности сервера. Оптимальные значения таймаута обычно 5–10 секунд. Для критичных приложений полезно реализовать повторные попытки с экспоненциальной задержкой между ними, чтобы уменьшить нагрузку на сервер.
При использовании urllib обработка выглядит аналогично, но нужно проверять код ответа сервера и перехватывать urllib.error.HTTPError и urllib.error.URLError. Важно логировать ошибки с указанием URL, кода ответа и времени запроса, чтобы проще было анализировать причины недоступности.
Дополнительно рекомендуется проверять заголовки ответа и наличие контента. Иногда сервер возвращает код 200, но содержимое страницы пустое или не соответствует ожидаемому. В таких случаях стоит фиксировать аномалию и при необходимости повторно делать запрос через несколько секунд.
Добавление заголовков и параметров запроса

При скачивании HTML-страниц с помощью Python важно корректно передавать заголовки HTTP и параметры запроса для имитации работы браузера и получения нужного контента. В модуле requests заголовки задаются через словарь headers:
Пример:
import requests
url = «https://example.com/data»
headers = {
«User-Agent»: «Mozilla/5.0 (Windows NT 10.0; Win64; x64)»,
«Accept-Language»: «ru-RU,ru;q=0.9»
}
response = requests.get(url, headers=headers)
html = response.text
Передача параметров запроса осуществляется через словарь params. Это полезно для GET-запросов с фильтрацией или пагинацией:
Пример:
params = {
«page»: 2,
«category»: «python»
}
response = requests.get(url, headers=headers, params=params)
html = response.text
Рекомендуется указывать заголовок User-Agent, иначе сервер может вернуть ошибку 403. Параметры запроса должны соответствовать документации API или структуре URL на сайте, иначе данные будут некорректными. Для сложных случаев с авторизацией можно добавлять cookies и referer в словарь заголовков.
Работа с кодировкой и чтение контента страницы

При загрузке HTML-страницы с помощью Python важно корректно определить кодировку. Библиотека requests автоматически пытается определить кодировку по заголовку Content-Type, но этот метод не всегда точен. Для точного результата используйте атрибут response.apparent_encoding из requests, который основан на анализе содержимого.
Пример корректного получения текста страницы с учетом кодировки:
import requests
url = 'https://example.com'
response = requests.get(url)
response.encoding = response.apparent_encoding
html_content = response.text
Если HTML содержит метатег с указанием кодировки, его можно прочитать через BeautifulSoup: from bs4 import BeautifulSoup. Это позволяет автоматически установить
soup = BeautifulSoup(response.content, 'html.parser')
meta_charset = soup.find('meta', charset=True)response.encoding.
Для корректного чтения страниц с нестандартной кодировкой, например Windows-1251, задайте кодировку явно: response.encoding = 'windows-1251'. После этого метод response.text вернет корректный Unicode.
При работе с бинарными данными используйте response.content, чтобы избежать проблем с неправильной интерпретацией символов. Преобразование в строку выполняется через decode, например: html_content = response.content.decode('utf-8').
Регулярная проверка и корректировка кодировки предотвращает появление некорректных символов, особенно при парсинге страниц на нескольких языках или с редкой локализацией.
Вопрос-ответ:
Какие библиотеки Python подходят для скачивания HTML страниц?
Наиболее часто используют requests для получения HTML-кода страницы и urllib для базовых операций с URL. Requests удобна для работы с HTTP-запросами, а urllib встроена в Python и не требует установки дополнительных пакетов. Для сложных случаев с динамическим контентом иногда применяют selenium, который управляет браузером и может получать содержимое, созданное JavaScript.
Как сохранить HTML страницу на компьютер после её скачивания?
После получения HTML-кода с помощью requests или urllib его можно записать в файл через стандартную функцию open(). Достаточно открыть файл в режиме записи (‘w’), указать кодировку, например ‘utf-8’, и записать содержимое с помощью write(). Это создаст локальную копию страницы, которую потом можно открыть в браузере или обработать программно.
Что делать, если сайт не отвечает на простой GET-запрос Python?
Некоторые сайты блокируют запросы, которые не выглядят как обращения браузера. В таких случаях стоит добавить заголовки HTTP, имитирующие обычный браузер, например User-Agent. Также может помочь установка таймаута или использование сессий requests. Если страница сильно зависит от JavaScript, обычный GET-запрос может не вернуть нужное содержимое, и тогда используют инструменты вроде selenium.
Можно ли скачивать страницы с авторизацией через Python?
Да, Python позволяет работать с авторизацией. Requests поддерживает базовую HTTP-авторизацию и работу с куки через объект Session. Для более сложной авторизации, например через формы логина, можно отправлять POST-запрос с данными пользователя и использовать полученные куки для последующих запросов. Таким образом можно получать HTML страниц, которые доступны только после входа в аккаунт.
Как обрабатывать ошибки при скачивании HTML страниц?
Важно проверять статус ответа от сервера. Requests возвращает объект Response, у которого есть поле status_code. Если код не равен 200, значит, произошла ошибка. Также стоит обрабатывать исключения, такие как ConnectionError или Timeout, чтобы программа не завершалась аварийно. Можно реализовать повторные попытки запроса через цикл или с помощью библиотеки retrying, чтобы повысить стабильность скачивания.
