PHP Парсер сайтов со своим USER AGENT

Форум для тех кто начинает осваивать язык php.
Force
Сообщения: 35
Благодарил (а): 1 раз

PHP Парсер сайтов со своим USER AGENT

Сообщение Force » Вт ноя 17, 2015 8:11 pm

Доброго времени суток. Есть готовый парсер, основная функция парсера file_get_contents(). Когда запускаю скрипт парсера, то сканируемый сайт может определить IP парсера (вот тут я писал, как это сделать: Как определить IP адрес пользователя на PHP). Вот этот элемент супер глобального массива: $_SERVER['HTTP_USER_AGENT'] по сути должен отследить USER AGENT парсера, но полученная переменная остаётся пустой или неопределённой. В этом моя проблема, мне нужно предать своему парсеру имя USER AGENT (1-2 слова), что бы его определяли другие сайты.

Будьте добры, помогите с решением. Заранее благодарю.
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2031
Поблагодарили: 62 раза

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Slash » Вт ноя 17, 2015 9:01 pm

Я бы для этой цели заменил функцию file_get_contents на CURL сеанс, а в параметрах сеанса (CURLOPT_USERAGENT) указывал бы имя агента посылаемого в HTTP запросе.

Код: Выделить всё

# Забиваем название USER AGENT в переменную
$user_agent = 'DANFA [Bot]'; 

# URL сканируемой страницы
$url = '';

# Инициализируем сеанс CURL
$ci = curl_init();  

# Задаем параметры сеанса
curl_setopt($ci, CURLOPT_URL, $url);
curl_setopt($ci, CURLOPT_USERAGENT, $user_agent); 
curl_setopt
($ci, CURLOPT_RETURNTRANSFER, true);

# Получаем результат
$result = curl_exec($ci);
if (!$result)
{
    # При ошибке останавливаем сценарий и выводим ошибку
    exit(curl_error($ci));
}

# Закрываем сеанс
curl_close($ci); 

Результат сеанса можно уже разбирать, как вам угодно, например если надо получить текст между тегов <title>:

Код: Выделить всё

# Вытаскиваем содержимое <title> с полученного результат
preg_match('#<title>(.*?)</title>#', $result, $arr);
echo $arr[1]; 

Если хотите, что бы сканируемая страница отображалась сразу после сеанса, удалите строчку:

Код: Выделить всё

curl_setopt($ci, CURLOPT_RETURNTRANSFER, true); 

Или true смените на false.
lyod
Сообщения: 76
Поблагодарили: 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение lyod » Вт ноя 17, 2015 9:08 pm

А как Вы передаёте User-Agent?
Вот так попробуйте:

Код: Выделить всё

# Настройки запроса
$options = array( 
    
'http'=>array(
        
'method' => "GET",
        
'header' => "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 YaBrowser/15.9.2403.3043 Safari/537.36"
    
)
);

# Формируем из массива настроек контекст
$context stream_context_create($options);

# Тут уже выполняете запрос
file_get_contents('адрес'$context); 
Force
Сообщения: 35
Благодарил (а): 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Force » Вт ноя 17, 2015 10:33 pm

Передаю так:

Код: Выделить всё

$content file_get_contents('url'); 

lyod, Ваш код выдал ошибку: Warning: file_get_contents() expects parameter 2 to be boolean, resource given in, сделал так:

Код: Выделить всё

$content file_get_contents('адрес'false$context); 

всё работает. Но если имя USER AGENT:

Код: Выделить всё

User-AgentMozilla/5.0 (Windows NT 6.1AppleWebKit/537.36 (KHTMLlike GeckoChrome/44.0.2403.157 YaBrowser/15.9.2403.3043 Safari/537.36

изменить, хотя бы на: Saturn, то вылетает другая ошибка: Warning: file_get_contents(http://url): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad request in.
Дело в том, что мне нужно короткое имя USER AGENT, а не строка длинною в метр. Тут можно, как то поправить?

Slash, читал про CURL, что для его работы необходима, какая-та отдельная библиотека, что возможно она уже установлена на сервере. Как это можно проверить?
lyod
Сообщения: 76
Поблагодарили: 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение lyod » Ср ноя 18, 2015 12:00 am

вылетает другая ошибка: Warning: file_get_contents(http://url): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad request in

Всё нормально, просто сервер, на который Вы делаете запрос не принимает не понятно какие User-Agent'ы.
Аватара пользователя
Slash
Администратор
Сообщения: 2031
Поблагодарили: 62 раза

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Slash » Ср ноя 18, 2015 7:22 am

Force писал(а):для его работы необходима, какая-та отдельная библиотека

Библиотека Libcurl. Проверить установлен ли CURL или нет, можно запустить файл на вашем хостинге с содержимым:

Код: Выделить всё

<?php
phpinfo
();

Найти категорию CURL и убедиться, что он enabled. Или вот:

Код: Выделить всё

echo function_exists('curl_init') ? 'CURL установлен' : 'CURL не установлен';

Теперь, проверил оба варианта парсера, оба варианта работают, мой и товарища lyod, но если сделать имя User Agent в одно или два слова (как вам надо), то функция file_get_contents() выдает ошибку (описано выше), а сеанс CURL работает не выдавая ошибок. Скорее всего решение для исправления ошибки в file_get_contents() есть, но я его пока не нашел...
Force
Сообщения: 35
Благодарил (а): 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Force » Ср ноя 18, 2015 11:06 am

Попробовал с curl, всё работает, значит curl библиотека у меня есть!
В списке phpinfo не нашел категорию curl. Список не маленький, наверно просто проглядел.
Спасибо за помощь.
Аватара пользователя
June
Сообщения: 22

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение June » Чт ноя 19, 2015 2:28 pm

Способ, который предложил lyod, вполне рабочий. Попробуйте в конце заголовка User-Agent добавить "\r\n".

Также можно настроить параметр user_agent в конфигурационном файле.
Force
Сообщения: 35
Благодарил (а): 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Force » Чт ноя 19, 2015 7:02 pm

June, вот так сделал:

Код: Выделить всё

$options = array(
    
'http' => array(
        
'method' => "GET",
        
'header' => "Saturn\r\n"
    
)
);

$context stream_context_create($options);
file_get_contents('URL'$context); 

И опять ошибка: Warning: file_get_contents() expects parameter 2 to be boolean, resource given in, если добавлю false, то: Warning: file_get_contents(http://url): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad request in, ну всё, как тут: Re: PHP Парсер сайтов со своим USER AGENT. Что делаю неправильно?
June писал(а):Также можно настроить параметр user_agent в конфигурационном файле.

Можно подробнее? Что за файл такой?
Аватара пользователя
June
Сообщения: 22

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение June » Чт ноя 19, 2015 7:47 pm

$context нужно передавать в третьем параметре. Покажите ваш 'URL'.

Многие хостинг-провайдеры позволяют редактировать т.н. пользовательский php.ini, а если такой возможности нет, можно использовать функцию ini_set или директиву php_value в файле .htaccess!
Force
Сообщения: 35
Благодарил (а): 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Force » Пт ноя 20, 2015 2:32 pm

June писал(а):$context нужно передавать в третьем параметре.

Я так и делаю, в четвёртом сообщении я показал пример:

Код: Выделить всё

$content file_get_contents('адрес'false$context); 

June писал(а):Покажите ваш 'URL'.

Пробую на любом, пробовал http://yandex.ru http://mail.ru всё одна и та же ошибка.

Я не могу редактировать php.ini. Покажите, как задать USER AGENT через ini_set?
Аватара пользователя
June
Сообщения: 22

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение June » Сб ноя 21, 2015 12:47 am

Force писал(а):Пробую на любом, пробовал http://yandex.ru http://mail.ru всё одна и та же ошибка.

Попробуйте обратиться к какому-нибудь менее притязательному сайту. Яндекс и Мэйл действительно могут проверять User-Agent на соответствие определенным критериям, прежде чем отвечать на запрос, о чем писал lyod. Если CURL помогает исправить ситуацию, это хорошо.

Force писал(а):Я не могу редактировать php.ini. Покажите, как задать USER AGENT через ini_set?

В смысле? Там простой синтаксис:

Код: Выделить всё

ini_set('имя','значение'); 

В качестве имени используйте user_agent, ну а в качестве значения ваш Сатурн.
Force
Сообщения: 35
Благодарил (а): 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Force » Сб ноя 21, 2015 6:39 pm

June писал(а):Попробуйте обратиться к какому-нибудь менее притязательному сайту.

Пробовал к любому, к сайтам на Укоз, Гугл, на этот форум пробовал. Работает только с CURL, с функция file_get_contents() не получается у меня, похоже, что у меня мало знаний.
June писал(а):В смысле?

В смысле у меня нет доступа к файлу php.ini.
Аватара пользователя
Slash
Администратор
Сообщения: 2031
Поблагодарили: 62 раза

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение Slash » Сб ноя 21, 2015 9:05 pm

Force писал(а):Работает только с CURL

Ну, дык... А, что мешает его использовать?
lyod
Сообщения: 76
Поблагодарили: 1 раз

Re: PHP Парсер сайтов со своим USER AGENT

Сообщение lyod » Сб ноя 21, 2015 9:23 pm

Force, я же показал, как User-Agent указывать. Сделайте так:

Код: Выделить всё

<?php
    $options 
= array(
        
'http' => array(
            
'method' => "GET"
            
'header' => "User-Agent: Saturn\r\n"
        
)
    );

    
$context stream_context_create($options);
    
file_get_contents('URL'false$context); 

И будет работать.

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость