-
Вебмастеру
(
http://forum.oszone.net/forumdisplay.php?f=22)
leonid.poydolov@fb |
05-11-2016 11:55 2684840 |
PHP парсер(грабер) погоды с подстановкой User-Agent
Сейчас сайт погоды определяет браузер, после чего дает загружать страницу..
Подскажите куда вставить код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($fp, 8192);
}
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($matches, 1) . '; ?>');
}
}
echo isset($matches[1]) ? $matches[1] : '';
|
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.
|
leonid.poydolov@fb |
07-11-2016 07:33 2685310 |
Ошибка - пишет Сервер погоды временно недоступен
- $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($fp, 8192); } 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($matches, 1) . '; ?>'); } } echo isset($matches[1]) ? $matches[1] : '';
|
leonid.poydolov@fb, а это уже проблема того, что второй код устарел на текущий момент.
Если вывести полученные данные, добавив в конец:
PHP код:
echo '<pre>' . htmlspecialchars($data) . '</pre>';
Можно увидеть, что сервер еще как доступен и выдал нам много данных.
Вот только в нём из-за обновленной верстки уже нет того, что проверяется по $pattern в следующем условии:
PHP код:
if (!preg_match($pattern, $data, $matches)) // страница не доступна
Поэтому скрипт и выводит 'Сервер погоды временно недоступен'.
P.S.: так ли необходимо получать данные о погоде граббером? У Яндекс.Погоды есть неплохой информер.
|
leonid.poydolov@fb |
09-11-2016 06:04 2685973 |
Цитата:
Цитата 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
все равно так же...
|
Время: 14:58.
© OSzone.net 2001-