Работа с cookies

Очень часто новички в области грабинга/парсинга сайтов задают один и тот же вопрос:
“Как максимально просто отлавливать и устанавливать cookie?”.

Используя curl работа с кукисами стает вообще максимально простой. Вам стоит всего лишь использовать следующий код:

if(is_writable($CookieFile)) {
curl_setopt($curl_handler, CURLOPT_COOKIEFILE, $CookieFile);
curl_setopt($curl_handler, CURLOPT_COOKIEJAR, $CookieFile);
} else {
die('Файл не является записываемым: '.$CookieFile);
}

Для вас может быть новой такая опция как CURLOPT_COOKIEJAR и это неудивительно. Например, в моей версии официальной документации к PHP она не описана.

Что же делает данный кусок кода?

Поэтапно:

  • Проверяет можно ли писать в указанный в переменной $CookieFile файл
  • Если нельзя - выводит ошибку
  • Если можно - устанавливает кукисы из файла $CookieFile и устанавливает запись кукисов в данный файл

Грубо говоря, при помощи данного кода вы сохраняете все кукисы в файл и потом их используете.

Это может быть полезно когда:

  • на сайте используется сессионная модель взаимодействия с посетителями
  • когда аутентификация основана на информации из кукисов
  • когда в кукисы записываются какие-либо переменные, необходимые для дальнейшей работы на сайте

Дополнительные ссылки:

4 комментариев

  1. lamer:

    Кстати, не в курсе, как, используя CURL, указывать нужный USER_AGENT? Формировал заголовки сам, передавал их CURL’у, но все равно в запросе не оказывается ни каких упоминаний о браузере. :(

  2. admin:

    В курсе. Надо нервно курить ман, а не бегать по блогам и задавать подобные вопросы.

  3. psihoz:

    С файлами не всегда можно и удобно работать - в этом случае можно использовать опцию курла HEADERFUNCTION. Ниже пример функции-обработчика.
    /**
    * this function is used for parsing headers to update cookies
    */
    private function _headerCallback($curl, $header)
    {
    $length = strlen($header);
    if(!strncasecmp($header, “Set-Cookie:”, 11))
    {
    $cookiestr = trim(substr($header, 11, -1));
    $cookie = explode(’;', $cookiestr);
    $cookie = explode(’=', $cookie[0]);
    $cookiename = trim(array_shift($cookie));
    $this->cookies[$cookiename] = trim(implode(’=', $cookie));
    }

    $cookie = “”;

    if( trim($header) == “” )
    { #execute only at end of header
    foreach ($this->cookies as $key=>$value)
    {
    $cookie .= “$key=$value; “;
    }
    curl_setopt($this->ch, CURLOPT_COOKIE, $cookie);
    }
    return $length;
    }

  4. admin:

    Тоже хорошее решение. Спасибо.

Оставить комментарий