Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
Всем привет.
Есть парсер, который работает через curl. Вот пример:

function get_page_html($url, $post_params='')
{
	//инициализируем сеанс
	$curl = curl_init();
	 
	//уcтанавливаем урл, к которому обратимся
	curl_setopt($curl, CURLOPT_URL, $url);
	 
	//передаем данные по методу post
	if(!empty($post_params))
		curl_setopt($curl, CURLOPT_POST, 1);
	
	//разрешаем перенаправление на полученный в заголовке URL
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
	
	//выводим заголовки
	curl_setopt($curl, CURLOPT_HEADER, 1);
	 
	//теперь curl вернет нам ответ, а не выведет
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	 
	//переменные, которые будут переданные по методу post
	if(!empty($post_params))
		curl_setopt($curl, CURLOPT_POSTFIELDS, $post_params);
	
	//имитируем браузер опера
	curl_setopt($curl, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.7.62 Version/11.01');
	 
	//получаем html
	$res = curl_exec($curl);	
	
	//закрываем 
	curl_close($curl);
	
	return $res;
}

Проблема в том, что на определенном этапе, сайт начинает считать меня роботом, т.е.

curl_setopt($curl, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.7.62 Version/11.01');

не помогает. Вопрос: как правильно имитировать браузе?
16 мар 11, 12:56    [10378871]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
Referer может еще нужен?
16 мар 11, 13:01    [10378902]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 23830
urukhay
Проблема в том, что на определенном этапе, сайт начинает считать меня роботом...

На сколько я понимаю, - это робот и есть. Разве нет?
Вообще-то сайты, которые борются с роботами, на USERAGENT вообще внимания не обращают. Определяют робот-не робот совершенно по другим признакам.
16 мар 11, 13:02    [10378920]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 23830
Hett
Referer может еще нужен?

Например, по рефереру. Но это - самое простое.
16 мар 11, 13:04    [10378931]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
Куки включите попробуйте. Вообще снифер возьмите да поглядите, отправляйте такой же заголовок.
16 мар 11, 13:07    [10378969]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
ShSerge,
Я поэтому и создал тему, потому что не знаю, как правильно сделать так, чтобы сайт воспринимал меня как браузер.

Hett,
можно пример с реферером?
16 мар 11, 13:08    [10378980]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
Hett,
и если не сложно, еще пример с куками
16 мар 11, 13:09    [10378990]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 23830
urukhay
Hett,
и если не сложно, еще пример с куками

Он же Вам снифер посоветовал. Я Вам советую фидлер. :)
Ну и фамилии.
16 мар 11, 13:11    [10379009]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
Я просто не совсем понял, что я должен сделать. Снифер это прога, которая перехватывает трафик. Ну скачаю я ее, а дальше что?
16 мар 11, 13:15    [10379046]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
Когда-то делал авторизацию на сервисах яндекса, там помнится еще таймштамп нужно было посылать.

Пример использования куков
    function __construct($username, $password)
    {
        $this->cookie_name = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ya_post_cookie.txt';

        $this->username = $username;
        $this->password = $password;

        $this->ch = curl_init();
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($this->ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($this->ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
        curl_setopt($this->ch, CURLOPT_COOKIEJAR,  $this->cookie_name);
        curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookie_name);
        curl_setopt($this->ch, CURLOPT_NOBODY, 1);
        curl_setopt($this->ch, CURLOPT_POST, 1);
    }
16 мар 11, 13:17    [10379069]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
urukhay
Я просто не совсем понял, что я должен сделать. Снифер это прога, которая перехватывает трафик. Ну скачаю я ее, а дальше что?

Скачайте фидлер, пустите через него браузер, сможете видеть что передается.
16 мар 11, 13:17    [10379073]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
фидлер это вообще что такое?) нахожу то Аркадия то Джона Фидлера)))
Может кто поделится ссылкой?
16 мар 11, 14:09    [10379583]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 23830
urukhay
фидлер это вообще что такое?) нахожу то Аркадия то Джона Фидлера)))
Может кто поделится ссылкой?

Тынц.
16 мар 11, 14:12    [10379603]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
Спасибо. Буду разбираться)
16 мар 11, 14:59    [10380112]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
Получил следующие заголовки:

GET http://yell.ru/search/%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BE%D0%BA%D0%BE%D0%BD/ru/page50/524420/small HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: yell.ru

Объясните пожалуйста, что мне теперь надо изменить в моем коде?

PS: я впервые этим занимаюсь, поэтому, возможно, задаю банальные вопросы.
16 мар 11, 15:17    [10380279]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 23830
urukhay,

Всё это дело (что написано) вставить в кулр.
16 мар 11, 15:25    [10380339]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
В какую опцию?
И не могли бы Вы просто кодом написать как должно быть, скопировав что нужно из моего? Так быстрее будет и для меня и для Вас: не буду мучать глупыми вопросами :)
Заранее спасибо за понимание)
16 мар 11, 15:47    [10380576]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
В общем ни реферер, ни хттп заголовки не помогли! Вот что сделал:

//устанавливаем реферер
curl_setopt($curl, CURLOPT_REFERER, 'http://yandex.ru');
	
//шлем заголовки
$headers = array();
$headers[] = 'GET http:'.$url_header;
$headers[] = 'Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, 
application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*';
$headers[] = 'Accept-Language: ru';
$headers[] = 'User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)';
$headers[] = 'Accept-Encoding: gzip, deflate';
$headers[] = 'Connection: Keep-Alive';
$headers[] = 'Host: yell.ru';
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

Еще есть идеи?
17 мар 11, 10:02    [10383509]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
А поля то точно все отсылаете?
17 мар 11, 11:24    [10384139]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
Привду то, что есть:

$page = 450;
$cmp = 1;
$url = 'http://yell.ru/search/установка%20окон/ru/page'.$page.'/524420/small';
$url_header = '//yell.ru/search/'.urlencode('установка окон').'/ru/page'.$page.'/524420/small HTTP/1.1';

//получаем html
$res = get_page_html($url, $url_header);
 
//проверяем, если ошибка, то получаем номер и сообщение
if(!$res){
	$error = curl_error($res).'('.curl_errno($res).')';
	echo $error;
	exit;
}
//если не ошибка, то парсим
else
{
	$res = trim($res);		
	parse_company_list_page_html($res, $url_header);			
}

echo 'Inserted: '.($cmp-1).'<br>ID: '.mysql_insert_id();
 


function get_page_html($url, $url_header, $post_params='')
{
	//инициализируем сеанс
	$curl = curl_init();
	 
	//уcтанавливаем урл, к которому обратимся
	curl_setopt($curl, CURLOPT_URL, $url);
	 
	//передаем данные по методу post
	if(!empty($post_params))
		curl_setopt($curl, CURLOPT_POST, 1);
	
	//разрешаем перенаправление на полученный в заголовке URL
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
	
	//выводим заголовки
	curl_setopt($curl, CURLOPT_HEADER, 1);
	
	//устанавливаем реферер
	curl_setopt($curl, CURLOPT_REFERER, 'http://yandex.ru');
	
	//шлем заголовки
	$headers = array();
	$headers[] = 'GET http:'.$url_header;
	$headers[] = 'Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*';
	$headers[] = 'Accept-Language: ru';
	$headers[] = 'User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)';
	$headers[] = 'Accept-Encoding: gzip, deflate';
	$headers[] = 'Connection: Keep-Alive';
	$headers[] = 'Host: yell.ru';
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
	
	//теперь curl вернет нам ответ, а не выведет
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	 
	//переменные, которые будут переданные по методу post
	if(!empty($post_params))
		curl_setopt($curl, CURLOPT_POSTFIELDS, $post_params);
	
	//имитируем браузер опера
	curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)');
	 
	//получаем html
	$res = curl_exec($curl);	
	
	//закрываем 
	curl_close($curl);
	
	return $res;
}

Переменная cmp - это счетчик, сколько записей добавлено в БД. Считается она уже в самом парсере. Когда сайт меня банит, на выходи я получаю:

Inserted: 0
ID: 0
17 мар 11, 11:52    [10384383]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
А че реферер такой?
17 мар 11, 11:54    [10384404]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
А что не так с ним? Я правльно понимаю, что реферер - это откуда перешли? Если нет, можно Вас попросить еще примерчик для моего случая!
17 мар 11, 12:06    [10384501]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
Откуда перешли, а точнее предыдущая страница, если вы отправляете форму, то какая страница будет предыдущей?
17 мар 11, 12:24    [10384628]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
urukhay
Member

Откуда:
Сообщений: 355
Ясно. Т.е. если я в данный момент нахожусь на странице

http://www.site.ru/page/1/

то реферер будет

http://www.site.ru/

а для

http://www.site.ru/page/4/


к примеру реферер будет

http://www.site.ru/page/3/

Я правильно понял?
17 мар 11, 12:48    [10384871]     Ответить | Цитировать Сообщить модератору
 Re: Curl. Имитация браузера  [new]
Hett
Member

Откуда: Бийск, Новосибирск
Сообщений: 10752
Ну если вы со страницы 3 перешли на страницу 4, то да. А если вы просто в адресе набрали, то реферера не будет.
17 мар 11, 14:17    [10385749]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / PHP, Perl, Python Ответить