Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
Привет!

Есть url : https: //shop.donaldson.com/store/ru-ru/product/P550299/20271
- в браузер идёт полная красивая инфа.
- а через cURL (а так-же кэш гугла, например) получают только треть инфы с этого сервера - часть данных не поступает.

Пытался заголовками через cURL полностью "мимикрировать" под свой браузер: безрезультатно.
Сертификаты не подключал (не знаю как, думаю не в них дело, раз идёт загрузка) : CURLOPT_SSL_VERIFYPEER => false

Как думаете реально получить через cURL то, что можно получить через браузер?
15 дек 18, 16:34    [21764850]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
vkle
Member

Откуда: Самара
Сообщений: 14373
Открываю страницу в браузере, жму Ctrl+S, сохранить только HTML - итоговый размер файла 105057 байт.
Из консоли тот же адрес без мимикрирований:
$ curl 'https://********/store/ru-ru/product/P550299/20271' 2>/dev/null | wc -c
97823
Ну да, в несколько килобайт есть разница, но никак не на две трети.
15 дек 18, 19:04    [21764903]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
Ну, я не взвешивал - оценивал подгруз визуально ("контентно, информативно") - если так можно выразиться. Самое тяжёлое там скрипты и картинка с фильтром - их cURL подгружает, а, например, размер этого фильтра (и применимость) - уже нет.

Сорри, что не совсем ясно в начале выразился...
15 дек 18, 19:44    [21764927]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
vkle
Member

Откуда: Самара
Сообщений: 14373
zadov2008
оценивал подгруз визуально ("контентно, информативно")
Чем байты не устроли? Точнее и информативнее уж некуда.

zadov2008
скрипты и картинка с фильтром - их cURL подгружает, а, например, размер этого фильтра (и применимость) - уже нет
Какой URL дадите курлу для загрузки - такой и будет скачивать. По крайней мере, будет пытаться. Дали URL HTML-кода - он и будет запрошен и, возможно, получен. Требуется что-то ещё - указывайте конкретные URLы нужного. В ряде случаев для полноты "прикинуться браузером" потребуется поддержка куков и соблюдение последовательности запросов. Всю веб-страницу целиком (включая скрипты, стили, картинки и т.д.) за один запрос curl скачивать не умеет. Если очень надо получить веб-страницу (или сайт) целиком - это умеет wget.
15 дек 18, 20:41    [21764946]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
vkle, именно на этом сайте стоит защита от cURL. (многие, я видел, в форумах спрашивали как защитить сайт от cURL (количеством обращений, таймаутом и т.д.) - вот тут они могут посмотреть как эта защита работает в живую).

от cURL нужен только скачаный HTML-код (без стилей, картинок и т.д.) Но часть HTML-кода - защищена от cURL :

Вот середина html-кода при исследовании элемента браузером :
<div class="container">
	<h4> Атрибуты (характеристики)</h4>
	<table class="table table-striped">
		<tbody>
			<tr style="display: table-row;">
				<td>Наружный диаметр</td>
				<td>79 мм (3.11 Дюймы)</td>
			</tr>
			<tr style="display: table-row;">
				<td>Внутренний диаметр</td>
				<td>43 мм (1.69 Дюймы)</td>
			</tr>
			<tr style="display: table-row;">
				<td>Длина</td>
				<td>324 мм (12.76 Дюймы)</td>
			</tr>
			<tr style="display: none;">
				<td>Эффективность, определяемая коэффициентом «бета», 1000</td>
				<td>9 МИКРОН</td>
			</tr>
			<tr style="display: none;">
				<td>Тип наполнителя</td>
				<td>Синтетические</td>
			</tr>
			<tr style="display: none;">
				<td>Вид конструкции</td>
				<td>Картридж</td>
			</tr>
			<tr style="display: none;">
				<td>Область основного применения</td>
				<td>ALLISON 23018850</td>
			</tr>
		</tbody>
	</table>
</div>


Вот этот-же кусок у cURL :
<div class="container">
	<h4> Атрибуты (характеристики)</h4>
	<table class="table table-striped">
	</table>
</div>


Я уже много-чего перепробовал, чтобы подобрать правильные параметры cURL, чтобы меня восприняли как браузер - не смог...
15 дек 18, 21:10    [21764967]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
vkle
Member

Откуда: Самара
Сообщений: 14373
zadov2008
на этом сайте стоит защита от cURL
Глупости. Существует масса способов защиты от ботов, от "быстрого" скачивания, но "защита от cURL"...
Ладно, напишите своего клиента, не так уж оно и сложно. И пусть только этот сайт попробует не отдать правильный контент этому самописному клиенту! Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.
15 дек 18, 21:29    [21764971]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
vkle
Member

Откуда: Самара
Сообщений: 14373
zadov2008
Вот этот-же кусок у cURL :
Вот тот же кусок кода при просмотре в браузере по Ctrl+U
<div class="container"> <h4> Атрибуты (характеристики)</h4> <table class="table table-striped"> </table> </div>
Чем он отличается от вашего курлового?
15 дек 18, 21:41    [21764978]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
vkle, клиента за основу взял вот этого :
    function get_url( $url )
    {
        $user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';

        $options = array(

            CURLOPT_CUSTOMREQUEST  =>"GET",        //set request type post or get
            CURLOPT_POST           =>false,        //set to GET
            CURLOPT_USERAGENT      => $user_agent, //set user agent
            CURLOPT_COOKIEFILE     =>"cookie.txt", //set cookie file
            CURLOPT_COOKIEJAR      =>"cookie.txt", //set cookie jar
            CURLOPT_RETURNTRANSFER => true,     // return web page
            CURLOPT_HEADER         => false,    // don't return headers
            CURLOPT_FOLLOWLOCATION => true,     // follow redirects
            CURLOPT_ENCODING       => "",       // handle all encodings
            CURLOPT_AUTOREFERER    => true,     // set referer on redirect
            CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
            CURLOPT_TIMEOUT        => 120,      // timeout on response
            CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
			CURLOPT_SSL_VERIFYPEER	=> false,
        );

        $ch      = curl_init( $url );
        curl_setopt_array( $ch, $options );
        $content = curl_exec( $ch );
        $err     = curl_errno( $ch );
        $errmsg  = curl_error( $ch );
        $header  = curl_getinfo( $ch );
        curl_close( $ch );

        $header['errno']   = $err;
        $header['errmsg']  = $errmsg;
        $header['content'] = $content;
        return $header;
    }

	$result = get_url( $url );
	print_r($result);

дописывая его разными свойствами (нужными и не нужными). Пока url не победил :)
15 дек 18, 21:42    [21764980]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
vkle
zadov2008
Вот этот-же кусок у cURL :
Вот тот же кусок кода при просмотре в браузере по Ctrl+U
<div class="container"> <h4> Атрибуты (характеристики)</h4> <table class="table table-striped"> </table> </div>
Чем он отличается от вашего курлового?

Тем, что отсутствует
<tbody> куча данных </tbody>
15 дек 18, 21:45    [21764981]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
vkle
Member

Откуда: Самара
Сообщений: 14373
zadov2008
Пока url не победил :)
И не победите. До тех пор, пока очень внимательно не изучите, как работает эта веб-страничка и какие меры приняты для защиты от скачивания ее фрагментов. Перечитайте предыдущую фразу очень внимательно, каждое слово там имеет значение. Защита есть, но не там, где Вы ее пытаетесть "обойти".

zadov2008
Тем, что отсутствует
Максимум, что отсутствует - это переводы строки. Всё остальное - идентично. Читайте посты внимательно, а не по диагонали.
15 дек 18, 21:53    [21764989]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
Данные там подгружает js-скрипт и вставляет данные в таблицу (см. скрин). В этом и защита, вернее в том, что скрипт подгружает данные в таблицу, только когда пользователь серфит страницу. (ни сохраняет, ни смотрит исходный код, ни лезет с помощью cUrl... а классически открыл браузером).

К сообщению приложен файл. Размер - 28Kb
15 дек 18, 22:21    [21765004]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
vkle
Member

Откуда: Самара
Сообщений: 14373
Мыслите в правильном направлении.
Курл понятия не имеет о яваскрипте.
Веб-браузер имеет и умеет выполнять яваскрипт, который принимает участие в формировании документа.

zadov2008
В этом и защита
Ну, блин... Защита от Вас лично - наверно уже в этом месте начинается. Для остальных, кто интересуется в веб-технологиях, подгрузка фрагментов страницы отдельными частями - это довольно распространенная технология.
15 дек 18, 22:54    [21765031]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
что ж... если у кого будут идеи по этой теме, пишите...
js && cURL проблема распространённая и не такая простая - судя по нарытым темам в форумах. :)
15 дек 18, 23:20    [21765050]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
vkle
Member

Откуда: Самара
Сообщений: 14373
zadov2008
js && cURL проблема распространённая
Не ищите проблему там, где её нет. Курл в принципе не поддерживает яваскрипт.

Соответственно, Вам либо следует вовсе отказаться от использования "только curl" и посмотреть в другую сторону. Либо, следует писать скрипты, которые будут эмулировать поведение веб-браузера в соответствии с действиями яваскриптов - как минимум, формировать дополнительные запросы к вебсерверу и собирать страницу воедино.

В качестве альтернатив - попробуйте поискать консольный веб-браузер с поддержкой яваскрипта (js не все поддерживают) или обратите внимание на phantomjs или аналогичное ПО.

Если тырилка контента на винде работать будет - можно IE задействовать, он легко управляется через COM (последние версии не пробовал, но раньше проблем не было).
16 дек 18, 01:13    [21765098]     Ответить | Цитировать Сообщить модератору
 Re: (php, cUrl). cURL не получает полную информацию с сервера.  [new]
zadov2008
Member

Откуда:
Сообщений: 8
vkle, спасибо! попробую ...
16 дек 18, 01:23    [21765100]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить