Извлечение HTML через cURL в PHP: от простого к сложному

Раздел: PHP -> HTTP запросы с cURL

Работа с 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);

Цель: обход простых блокировок по заголовкам.

- Php curl content (содержимое ответа php curl)

Расширенные примеры использования 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 автоматически распакует ответ.

PHP cURL HTML - comments

En
Php curl html (php)