Работа с 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и устанавливает запись кукисов в данный файл
Грубо говоря, при помощи данного кода вы сохраняете все кукисы в файл и потом их используете.
Это может быть полезно когда:
- на сайте используется сессионная модель взаимодействия с посетителями
- когда аутентификация основана на информации из кукисов
- когда в кукисы записываются какие-либо переменные, необходимые для дальнейшей работы на сайте
Дополнительные ссылки:

lamer:
Кстати, не в курсе, как, используя CURL, указывать нужный USER_AGENT? Формировал заголовки сам, передавал их CURL’у, но все равно в запросе не оказывается ни каких упоминаний о браузере.
4 Март 2008, 12:55 ппadmin:
В курсе. Надо нервно курить ман, а не бегать по блогам и задавать подобные вопросы.
4 Март 2008, 10:10 пп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) == “” )
24 Сентябрь 2008, 1:54 пп{ #execute only at end of header
foreach ($this->cookies as $key=>$value)
{
$cookie .= “$key=$value; “;
}
curl_setopt($this->ch, CURLOPT_COOKIE, $cookie);
}
return $length;
}
admin:
Тоже хорошее решение. Спасибо.
30 Сентябрь 2008, 10:23 пп