Поиск по блогу

среда, 23 июня 2010 г.

3 способа установки User Agent при работе с библиотекой Simple HTML DOM Parser

Про юзерагенты на этом блоге я уже рассказывала. И говорила, что "неподставление" данных о User Agent-е в заголовок вашего запроса может выйти вам боком. Как подставить данные, если вы пользуетесь библиотекой Simple HTML DOM Parser?

Есть несколько очевидных способов.

Способ 1. Используйте Simple HTML DOM Parser в связке с cURL.
Самый простой способ. И для меня — самый удобный. Для установки юзерагента используйте параметр CURLOPT_USERAGENT.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($cr, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

$html_curl = curl_exec($ch);
curl_close($ch);

$html = str_get_html($html_curl);



Способ 2. Можете установить браузер по умолчанию в php.ini или использовать ini_set().

Пример:
ini_set("user_agent","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");


Тоже достаточно простой и удобный способ. Первый я в основном использую из-за того, что, как правило, приходится работать с cURL-ом (и с его возможностями) при загрузке страниц, поэтому мне удобнее установить User Agent именно там. Если бы курл был не нужен - использовала бы ini_set.


Способ 3. Можете непосредственно внести изменения в функцию библиотеки load_file().
Я сама этот способ не пробовала, но в архивах на всякий случай записан этот способ, взятый с стэковерфлоу.

В исходном коде функция выглядит следующим образом:

// load html from file
function load_file() {
$args = func_get_args();
$this->load(call_user_func_array('file_get_contents', $args), true);
}


А ее модификация может быть, например, такой:

// load html from file
function load_file() {
$args = func_get_args();
// Added by Mithun
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n".
"Cookie: foo=bar\r\n"
)
);
$context = stream_context_create($opts);
$args[1] = FALSE;
$args[2] = $context;
// End Mithun
$this->load(call_user_func_array('file_get_contents', $args), true);
}


Еще раз напомню, для чего вам User Agent. Допустим, вы пишете парсер, краулер или бота. Некоторые вебмастеры в robots.txt запрещают доступ к материалам сайта, если в хэдэре запроса установлен User Agent, стандартный для библиотек, работающих с http (или информация о нем вообще отсутствует). Устанавливая User Agent, вы маскируете свой запрос так, словно он поступил от браузера.

Но в любом случае надо знать меру. Если вы генерируете сотни запросов в минуту, то никакой юзерагент вас не прикроет :)
___

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Статьи схожей тематики:



3 комментария:

  1. добрый день!

    спасибо за статью.

    будет ли работать последний вариант при использовании file_get_html()?

    ОтветитьУдалить
  2. Здраствуйте! Curl выбивает ошибку на user Agent. Не могу разобратся в чем проблема.

    Warning: curl_setopt(): supplied argument is not a valid cURL handle resource in C:\Program Files\VertrigoServ\www\parser\proxy\2ip.php on line 6

    <?php

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.ip-1.ru/");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($cr, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
    curl_setopt($ch, CURLOPT_TIMEOUT,5);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    $dorf1 = curl_exec($ch);
    curl_close($ch);

    Версия курл-7.16.0

    ОтветитьУдалить
  3. Анонимный, я думаю, вы уже нашли у себя ошибку :) Написано cr вместо ch...

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

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

Поделиться