Обход 502 и 503 при парсинге через curl

silmarion

Полезный
Регистрация
21 Июн 2012
Сообщения
194
Реакции
19
Доброго всем, подкажите как можно обойти защиту при парсинге через CURL
Либо cloudflare, либо самописный.
 
Добавляете такую опцию curl_setopt( $ch, CURLOPT_HEADER, 1 ). В результате curl будет выдавать ответ с заголовками.
PHP:
$ch = curl_init();
curl_setopt( $ch, CURLOPT_HEADER, 1 );
$curlResult = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch );

if ($code == 502 || $code == 503){
echo 'Выпал код 502 или 503'
}
Из заголовков можно выпить ответ сервера.
Далее , если выпал нужный код ошибки, просто повторно делается запрос на получение страницы или таймаут и запрос.
 
Последнее редактирование:
Добавляете такую опцию curl_setopt( $ch, CURLOPT_HEADER, 1 ). В результате curl будет выдавать ответ с заголовками.
PHP:
$ch = curl_init();
curl_setopt( $ch, CURLOPT_HEADER, 1 );
$curlResult = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close ($ch );

if ($code == 502 || $code == 503){
echo 'Выпал код 502 или 503'
}
Из заголовков можно выпить ответ сервера.
Далее , если выпал нужный код ошибки, просто повторно делается запрос на получение страницы или таймаут и запрос.

А можно поподробнее?
Просто нужно спарсить несколько статей с сайта, а там cloudflare защита от ДДОС стоит, и заглушка выдает ошибку 503 для курла.
 
Последнее редактирование:
cloudflare не получится полностью автоматически обойти используя cURL,
там некоторые заголовки устанавливаются "на лету" с помощью JavaScript,
который cURL обрабатывать не умеет.

советую посмотреть в сторону Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся
 
cloudflare не получится полностью автоматически обойти используя cURL,
там некоторые заголовки устанавливаются "на лету" с помощью JavaScript,
который cURL обрабатывать не умеет.

советую посмотреть в сторону Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся
Насколько я читал, там выдается какое-то автоматически сгенерированное выражение, которое браузер должен посчитать и выдать ответ, или я неправ?

Как понял браузер должен расчитать математическое выражение из javascript и передать его в форму, если верно то получишь куку
А как это в курл реализовать?
К примеру идет запрос на курле, если попадается ошибка 502 или 503 использовать selenuim

if ($info['http_code']== 502 || $info['http_code'] == 503){

тут запускает обход, как его реализовать?

}
 
Последнее редактирование:
Насколько я читал, там выдается какое-то автоматически сгенерированное выражение, которое браузер должен посчитать и выдать ответ, или я неправ?
Как понял браузер должен расчитать математическое выражение из javascript и передать его в форму, если верно то получишь куку
А как это в курл реализовать?

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

Код:
function request($url, $post = array()) {
    $headers[] = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0';
    $headers[] = 'Accept: application/json, text/javascript, */*; q=0.01';
    $headers[] = 'Accept-Language: ru,en;q=0.5';
    $headers[] = 'Connection: keep-alive';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    if(count($post) > 0) {
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    }
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
    $data = curl_exec($ch);
    return $data;
}

$url = 'http://.....';

$data = request($url);
preg_match('/<form id="ChallengeForm" .+ name="act" value="(.+)".+name="jschl_vc" value="(.+)".+<\/form>.+jschl_answer.+\(([0-9\+\-\*]+)\);/Uis', $data, $out);
if(count($out) > 0) {
    eval("\$jschl_answer=$out[3];");
    $post['act'] = $out[1];
    $post['jschl_vc'] = $out[2];
    $post['jschl_answer'] = $jschl_answer;
    sleep(5);
    $data = request($url, $post);
}
var_dump($data);
 
Вроде то, что нужно, показывает страницу защиты, затем редиректит, только почему то не на $url редиректит
а Обратно на test1.ru
т.е. получаю к примеру Для просмотра ссылки Войди или Зарегистрируйся
а не Для просмотра ссылки Войди или Зарегистрируйся

Как дописать?
 
Так что есть еще мысли?
 
Назад
Сверху