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

Тема в разделе "Как сделать...", создана пользователем silmarion, 15 фев 2015.

  1. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    194
    Симпатии:
    19
    Доброго всем, подкажите как можно обойти защиту при парсинге через CURL
    Либо cloudflare, либо самописный.
     
  2. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    991
    Симпатии:
    267
    Добавляете такую опцию curl_setopt( $ch, CURLOPT_HEADER, 1 ). В результате curl будет выдавать ответ с заголовками.
    PHP:
    $ch curl_init();
    curl_setopt$chCURLOPT_HEADER);
    $curlResult curl_exec($ch);
    $code curl_getinfo($chCURLINFO_HTTP_CODE);
    curl_close ($ch );

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

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    194
    Симпатии:
    19
    А можно поподробнее?
    Просто нужно спарсить несколько статей с сайта, а там cloudflare защита от ДДОС стоит, и заглушка выдает ошибку 503 для курла.
     
    Последнее редактирование: 19 фев 2015
  4. warg

    warg Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    129
    Симпатии:
    136
    cloudflare не получится полностью автоматически обойти используя cURL,
    там некоторые заголовки устанавливаются "на лету" с помощью JavaScript,
    который cURL обрабатывать не умеет.

    советую посмотреть в сторону Перейти по ссылке
     
  5. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    194
    Симпатии:
    19
    Насколько я читал, там выдается какое-то автоматически сгенерированное выражение, которое браузер должен посчитать и выдать ответ, или я неправ?

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

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

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

    }
     
    Последнее редактирование: 19 фев 2015
  6. warg

    warg Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    129
    Симпатии:
    136
    там несколько видов защиты, математический 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);
     
    latteo нравится это.
  7. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    194
    Симпатии:
    19
    Вроде то, что нужно, показывает страницу защиты, затем редиректит, только почему то не на $url редиректит
    а Обратно на test1.ru
    т.е. получаю к примеру Перейти по ссылке
    а не Перейти по ссылке

    Как дописать?
     
  8. silmarion

    silmarion

    Регистр.:
    21 июн 2012
    Сообщения:
    194
    Симпатии:
    19
    Так что есть еще мысли?