Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » PHP парсер(грабер) погоды с подстановкой User-Agent

Ответить
Настройки темы
PHP парсер(грабер) погоды с подстановкой User-Agent

Аватара для leonid.poydolov@fb

Новый участник


Сообщения: 43
Благодарности: 0

Профиль | Отправить PM | Цитировать


Сейчас сайт погоды определяет браузер, после чего дает загружать страницу..
Подскажите куда вставить код1, в код2 парсера, чтобы при парсинге он определялся как браузер?

код1
PHP код: Выделить весь код

$out "GET $path HTTP/1.0\r\n"
    
$out .= "Accept: image/gif, application/xhtml+xml, */*\r\n"
    
$out .= "Accept-Language: ru\r\n"
    
$out .= "Host: $host\r\n"
                        
//Имитируем браузер Opera Mini:
    
$out .= "User-Agent: Opera/8.01 (J2ME/MIDP; ".
        
"Opera Mini/2.0.4509/1716; ru; U; ssr)\r\n"
    
$out .= "Cache-Control: no-cache\r\n"//Не кэшировать 
    
$out .= "Connection: Close\r\n\r\n"

код2
PHP код: Выделить весь код

<?php

$url               
'http://pogoda.yandex.ru/moscow/details'//загрузит
$beginBlock        '<div class=\"b-navigation-city\">';
$endBlock          '<div class=\"b-print b-noprint\">';
$cachefile         dirname(__FILE__) . '/cache/weather.php'// файл кеша
$cache_time_config 7200//время актуальности кеша 2 часа
//Проверяем наличие кеша
if (file_exists($cachefile))
{
                
$cachetime filemtime($cachefile); // время создание кеша
                
if ((time() - $cachetime) < $cache_time_config//если кеш не устарел - берем значение из него
                
{
                                
$cache_used true;
                                include 
$cachefile;
                }
}
if (!
$cache_used// если не использовали кеш - заправшиваем страницу с сервера погоды
{
                
$pattern '%' $beginBlock '(.*)' $endBlock '%isU';
                
$fp      = @fopen($url'r');
                if (!
$fp)
                                exit();
                
$data '';
                while (!
feof($fp))
                {
                                
$data .= fgets($fp8192);
                }
                
fclose($fp);
                
$data str_replace("yandex.st/weather/1.2.83/i""localhost"$data);
                if (!
preg_match($pattern$data$matches)) // страница не доступна
                
{
                                if (
file_exists($cachefile)) // берем из устаревшего кеша данные
                                
{
                                                include 
$cachefile;
                                }
                                else 
// кеш отсутствует
                                
{
                                                echo 
'Сервер погоды временно недоступен';
                                }
                }
                else 
// сохраняем в кеш новое значение
                
{
                                
file_put_contents($cachefile'<?php $matches=' var_export($matches1) . '; ?>');
                }
}
echo isset(
$matches[1]) ? $matches[1] : '';


Отправлено: 11:55, 05-11-2016

 

Аватара для Habetdin


Автор проектов


Сообщения: 3651
Благодарности: 1498

Профиль | Сайт | Отправить PM | Цитировать


leonid.poydolov@fb, первая переменная выдрана из кода, использующего, скорее всего, функцию fsockopen, поэтому просто так её во второй код с функцией fopen не вставить. Вместо этого необходимо переделать первый кусок кода в такой:
Код: Выделить весь код
// ...

$host = 'pogoda.yandex.ru';
$opts = array(
	'http' => array(
		'method' => "GET",
		'protocol_version' => 1.0,
		'header' => "Accept: image/gif, application/xhtml+xml, */*\r\n"
			. "Accept-Language: ru\r\n"
			. "Host: $host\r\n"
			. "User-Agent: Opera/8.01 (J2ME/MIDP; " // Имитируем браузер Opera Mini:
			. "Opera Mini/2.0.4509/1716; ru; U; ssr)\r\n"
			. "Cache-Control: no-cache\r\n" // Не кэшировать
			. "Connection: Close\r\n\r\n";
	)
);

$context = stream_context_create($opts);

// далее оригинальный код...
$fp      = @fopen($url, 'r', false, $context);
// ...
...и вставить перед вызовом fopen во второй код и добавив в него $context.

-------
Рекомендую: $25 на тест виртуального сервера (VPS) за регистрацию по ссылке


Последний раз редактировалось Habetdin, 07-11-2016 в 10:43. Причина: $context, да

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:55, 05-11-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для leonid.poydolov@fb

Новый участник


Сообщения: 43
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ошибка - пишет Сервер погоды временно недоступен

- $context - ни куда не надо включать " $fp = @fopen($url, 'r', false, $context); " - и все равно сервер не доступен

PHP код: Выделить весь код

<?php
$url               
'http://pogoda.yandex.ru/moscow/details'//загрузит
$beginBlock        '<div class=\"b-navigation-city\">';
$endBlock          '<div class=\"b-print b-noprint\">';
$cachefile         dirname(__FILE__) . '/cache/weather.php'// файл кеша
$cache_time_config 7200//время актуальности кеша 2 часа
//Проверяем наличие кеша
if (file_exists($cachefile))
{
                
$cachetime filemtime($cachefile); // время создание кеша
                
if ((time() - $cachetime) < $cache_time_config//если кеш не устарел - берем значение из него
                
{
                                
$cache_used true;
                                include 
$cachefile;
                }
}
if (!
$cache_used// если не использовали кеш - заправшиваем страницу с сервера погоды
{
                
$pattern '%' $beginBlock '(.*)' $endBlock '%isU';

$host 'pogoda.yandex.ru';
$opts = array(
    
'http' => array(
        
'method' => "GET",
        
'protocol_version' => 1.0,
        
'header' => "Accept: image/gif, application/xhtml+xml, */*\r\n"
            
"Accept-Language: ru\r\n"
            
"Host: $host\r\n"
            
"User-Agent: Opera/8.01 (J2ME/MIDP; " // Имитируем браузер Opera Mini:
            
"Opera Mini/2.0.4509/1716; ru; U; ssr)\r\n"
            
"Cache-Control: no-cache\r\n" // Не кэшировать
            
"Connection: Close\r\n\r\n",
    )
);

$context stream_context_create($opts);

                
$fp      = @fopen($url'r');
                if (!
$fp)
                                exit();
                
$data '';
                while (!
feof($fp))
                {
                                
$data .= fgets($fp8192);
                }
                
fclose($fp);
              
$data str_replace("yandex.st/weather/1.2.83/i""localhost"$data);
               if (!
preg_match($pattern$data$matches)) // страница не доступна
                
{
                                if (
file_exists($cachefile)) // берем из устаревшего кеша данные
                                
{
                                                include 
$cachefile;
                                }
                                  else 
// кеш отсутствует
                                
{
                                                echo 
'Сервер погоды временно недоступен';
                                }
                }
                else 
// сохраняем в кеш новое значение
                
{
                                
file_put_contents($cachefile'<?php $matches=' var_export($matches1) . '; ?>');
               }
}
echo isset(
$matches[1]) ? $matches[1] : '';


Последний раз редактировалось leonid.poydolov@fb, 07-11-2016 в 07:38.


Отправлено: 07:33, 07-11-2016 | #3


Аватара для Habetdin


Автор проектов


Сообщения: 3651
Благодарности: 1498

Профиль | Сайт | Отправить PM | Цитировать


leonid.poydolov@fb, а это уже проблема того, что второй код устарел на текущий момент.
Если вывести полученные данные, добавив в конец:
PHP код: Выделить весь код

echo '<pre>' htmlspecialchars($data) . '</pre>'

Можно увидеть, что сервер еще как доступен и выдал нам много данных.
Вот только в нём из-за обновленной верстки уже нет того, что проверяется по $pattern в следующем условии:
PHP код: Выделить весь код

if (!preg_match($pattern$data$matches)) // страница не доступна 


Поэтому скрипт и выводит 'Сервер погоды временно недоступен'.
P.S.: так ли необходимо получать данные о погоде граббером? У Яндекс.Погоды есть неплохой информер.

-------
Рекомендую: $25 на тест виртуального сервера (VPS) за регистрацию по ссылке


Отправлено: 18:22, 07-11-2016 | #4


Аватара для leonid.poydolov@fb

Новый участник


Сообщения: 43
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Habetdin:
так ли необходимо получать данные о погоде граббером? »
- это как образец.., делается для экономии трафика и тех у кого нет доступа в интернет из локальной сети...(через прокси по поиску в сети у них видишь запросы - погода и т.п.)

- еще сколько сотрудников столько сайтов погоды, каждый норовит на своем смотреть....gismeteo, rp5, 7meteo и т.п... типа яшка врет с погодой...

Цитата Habetdin:
проверяется по $pattern в следующем условии »
это в курсе, что начальный и конечный тег вырезки изменился на..
PHP код: Выделить весь код

$beginBlock        '<div class="content">';
$endBlock          '<div class="footer footer_providers clearfix" role="contentinfo"> '

в настройка php.ini
в параметре выставил
user_agent Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 YaBrowser/16.9.1.1192 Yowser/2.5 Safari/537.36

все равно так же...

Последний раз редактировалось leonid.poydolov@fb, 09-11-2016 в 09:01.


Отправлено: 06:04, 09-11-2016 | #5



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » PHP парсер(грабер) погоды с подстановкой User-Agent

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
парсер php если пололжение выбирается скриптом garanov Вебмастеру 0 03-08-2015 16:32
php парсер если есть выбор города garanov Хочу все знать 2 03-08-2015 14:52
PHP - Добавить в парсер замену url leonid.poydolov@fb Вебмастеру 1 02-12-2014 16:38
Интернет - [решено] user agent в IE изменить под разными учетками-МИФ?? gangsterovich Microsoft Windows 7 19 30-11-2013 14:00
Грабер slonick2012@vk Вебмастеру 6 03-07-2012 09:23




 
Переход