Извлечение HTML через cURL в PHP: от простого к сложному
Работа с cURL в PHP для получения HTML
Наиболее эффективный способ получения HTML содержимого веб-страницы с помощью cURL
Функция ниже использует основные настройки: устанавливает URL, возвращает результат в виде строки, обрабатывает редиректы и проверяет ошибки.
function getHtml($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
$html = curl_exec($ch);
if (curl_errno($ch)) {
$error = curl_error($ch);
curl_close($ch);
return 'Ошибка cURL: ' . $error;
}
curl_close($ch);
return $html;
}
Php curl close (php curl close)
Использование: $html = getHtml('https://example.com');
Цель: быстрая загрузка любой публичной HTML страницы для последующего парсинга или анализа.
Типичные ошибки
- Ошибка SSL (SSL certificate problem): временно отключается проверкой
CURLOPT_SSL_VERIFYPEER = false, но для продакшена лучше настроить правильные CA-сертификаты. - Пустой ответ: возможно, сервер требует User-Agent или cookies.
- Бесконечный редирект: ограничить число редиректов через
CURLOPT_MAXREDIRS.
Как отправить GET запрос и получить HTML?
Базовый пример без дополнительных опций:
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
Php curl cookie (php curl cookie)
Если сервер возвращает не HTML, а JSON, то результат будет в строке. Для получения HTML достаточно указать правильный URL.
Проблема: сервер возвращает код 403 или 302
Необходимо добавить имитацию браузера через User-Agent и обработку редиректов.
Как отправить POST запрос с данными формы?
Для отправки POST данных используется опция CURLOPT_POST и CURLOPT_POSTFIELDS:
$data = ['username' => 'test', 'password' => '123'];
$ch = curl_init('https://example.com/login');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$html = curl_exec($ch);
curl_close($ch);
Curl exec php (php curl exec)
Цель: логин на сайт, отправка формы обратной связи.
Ошибка: сервер ожидает JSON, а не URL-encoded
В таком случае передавать данные как строку JSON и установить заголовок Content-Type: application/json через CURLOPT_HTTPHEADER.
Как обрабатывать заголовки ответа?
Чтобы получить заголовки вместе с телом, используют CURLOPT_HEADER:
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
// разделить заголовки и тело
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
Php curl get (php curl get запрос)
Цель: анализ кода ответа, кук, типа контента.
Как работать с куками?
Для сохранения и отправки кук используется CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR:
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); // файл для чтения кук
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); // файл для записи кук
$html = curl_exec($ch);
curl_close($ch);
Php curl html (php curl html)
Цель: сессионные запросы, имитация авторизованного пользователя.
Проблема: куки не сохраняются
Проверить права на запись в файл, использовать абсолютный путь.
Как использовать прокси?
Прокси-сервер задается через CURLOPT_PROXY:
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
Php curl https (php curl https)
Для аутентификации: CURLOPT_PROXYUSERPWD.
Как обрабатывать ошибки cURL?
Полный контроль ошибок:
if (curl_errno($ch)) {
echo 'Ошибка: ' . curl_error($ch);
} else {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode >= 400) {
echo 'HTTP ошибка: ' . $httpCode;
}
}
Php curl init (php curl init)
Цель: диагностика и логирование.
Как выполнять параллельные запросы?
Используется curl_multi_* функции:
$urls = ['https://a.com', 'https://b.com'];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$handles[$i] = curl_init($url);
curl_setopt($handles[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $handles[$i]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);
foreach ($handles as $i => $ch) {
$result = curl_multi_getcontent($ch);
// обработка $result
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
Curl setopt php (php curl setopt)
Цель: ускорение загрузки множества страниц.
Как скачать файл?
Используется CURLOPT_FILE:
$fp = fopen('download.zip', 'w');
$ch = curl_init('https://example.com/file.zip');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
Php curl ssl (php curl ssl)
Цель: загрузка больших файлов без загрузки в память.
Как следовать редиректам?
Опция CURLOPT_FOLLOWLOCATION с ограничением:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
Php curl url (php curl url)
Цель: автоматический переход на конечный URL.
Ошибка: CURLOPT_FOLLOWLOCATION не работает с некоторыми серверами
Возможно, из-за open_basedir или safe_mode (в старых версиях PHP). Альтернатива - вручную обрабатывать заголовок Location.
Как настроить SSL?
Для продакшена следует указать путь к CA-сертификатам:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');
Php curl authorization (php curl авторизация)
Цель: безопасные HTTPS запросы.
Как установить таймауты?
Таймаут соединения и выполнения:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // секунд
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
Php curl error (ошибки php curl)
Цель: избежать зависания скрипта.
Как имитировать браузерный запрос?
Помимо User-Agent, можно добавить заголовки Accept, Accept-Language, Referer:
$headers = [
'Accept: text/html,application/xhtml+xml,...',
'Accept-Language: ru-RU,ru;q=0.9',
'Referer: https://google.com'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
Цель: обход простых блокировок по заголовкам.
Расширенные примеры использования cURL
1. POST запрос с JSON и обработка ответа
$url = 'https://api.example.com/items';
$data = json_encode(['name' => 'New Item', 'price' => 100]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer token123'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo 'HTTP код: ' . $httpCode . "\n";
echo 'Ответ: ' . $response . "\n";
HTTP код: 201
Ответ: {"id":42,"name":"New Item","price":100}
2. Загрузка нескольких страниц с помощью curl_multi (вывод времени)
$urls = [
'https://httpbin.org/delay/2',
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/3'
];
$mh = curl_multi_init();
$handles = [];
$start = microtime(true);
foreach ($urls as $i => $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_multi_add_handle($mh, $ch);
$handles[$i] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running);
$results = [];
foreach ($handles as $i => $ch) {
$results[$i] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
curl_multi_close($mh);
$time = microtime(true) - $start;
echo 'Общее время: ' . round($time, 2) . ' сек.\n';
// Вывод длины каждого ответа
foreach ($results as $i => $content) {
echo "URL $i: " . strlen($content) . " байт\n";
}
Общее время: 3.01 сек. URL 0: 253 байт URL 1: 253 байт URL 2: 253 байт
3. Отправка запроса с Digest-аутентификацией
$ch = curl_init('https://example.com/protected');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, 'username:password');
$html = curl_exec($ch);
curl_close($ch);
echo $html;
Результат: содержимое защищенной страницы.
4. Использование пользовательского таймаута на чтение и прогресс-бар
$ch = curl_init('https://example.com/largefile');
$fp = fopen('/dev/null', 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function($resource, $downloadSize, $downloaded, $uploadSize, $uploaded) {
if ($downloadSize > 0) {
$percent = round($downloaded / $downloadSize * 100, 2);
echo "Загружено: $percent%\n";
}
});
curl_exec($ch);
fclose($fp);
curl_close($ch);
Данный пример записывает данные в /dev/null (для теста) и отображает прогресс.
5. Запрос через SOCKS5 прокси
$ch = curl_init('https://httpbin.org/ip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, 'socks5://127.0.0.1:9050');
$result = curl_exec($ch);
curl_close($ch);
echo $result;
{"origin": "192.168.1.1"}
6. Отправка файла через multipart/form-data
$ch = curl_init('https://example.com/upload');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
$post = [
'file' => new CURLFile('/path/to/photo.jpg', 'image/jpeg', 'photo.jpg'),
'caption' => 'My photo'
];
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Цель: загрузка изображений или документов.
7. Получение HTML с куками и сессией (имитация входа)
$cookieFile = tempnam(sys_get_temp_dir(), 'cookies');
// Первый запрос - получение формы и кук
$ch = curl_init('https://example.com/login');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);
$loginPage = curl_exec($ch);
curl_close($ch);
// Извлекаем CSRF токен (упрощенно)
preg_match('/ 'user',
'password' => 'pass',
'csrf_token' => $csrfToken
]));
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
$result = curl_exec($ch);
curl_close($ch);
// Теперь $result содержит HTML после логина
unlink($cookieFile);
8. Обработка сжатия gzip/deflate
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, ''); // пустая строка - все типы сжатия
$html = curl_exec($ch);
curl_close($ch);
echo strlen($html) . ' байт';
cURL автоматически распакует ответ.