MefistofeleS

Вывод данных с другого сайта

Recommended Posts

Как можно сделать так, что бы на сайте выводилась информация с другого? например, статус персонажа в игре как тут http://murdrum.ru/char/Obscurus

Подскажите, пожалуйста.

Читайте страницу и ищите нужную вам строчку:


<tr><td style="height:26px; width:70px; text-align:left; vertical-align:bottom; border-bottom:1px solid #f6f3ec;">Статус</td><td style="text-align:left; vertical-align:bottom;"><span style='color:green;'>Online</span></td></tr>

Конечно это лучше делать отдельно через cron и с периодичностью обновлять результат.

Share this post


Link to post
Share on other sites

Читайте страницу и ищите нужную вам строчку:


<tr><td style="height:26px; width:70px; text-align:left; vertical-align:bottom; border-bottom:1px solid #f6f3ec;">Статус</td><td style="text-align:left; vertical-align:bottom;"><span style='color:green;'>Online</span></td></tr>

Конечно это лучше делать отдельно через cron и с периодичностью обновлять результат.

Вы меня наверное не поняли..) Мне надо что бы на другом сайте показывало онлайн етот игрок или нет? или я вас не понял. что мне ето даст?


<tr><td style="height:26px; width:70px; text-align:left; vertical-align:bottom; border-bottom:1px solid #f6f3ec;">Статус</td><td style="text-align:left; vertical-align:bottom;"><span style='color:green;'>Online</span></td></tr>

Share this post


Link to post
Share on other sites

Получаем содержимое сайта, например, при помощи file_get_contents() и парсим.

Share this post


Link to post
Share on other sites

первый раз в жизни попробовал ради интереса регуляркой вытащить данные со страницы и че-то какая-то шляпа получилась:


$file = file_get_contents("http://murdrum.ru/char/Obscurus");
preg_match("#<td.*?>(.*?)</td>#is", $file, $td);
preg_match("#<span.*?>(.*?)</span>#is", $td[1], $span);
$r = $td[1];
echo $r;

если бы там стоял класс какой-нибудь было бы наверное попроще.

Share this post


Link to post
Share on other sites

Вы меня наверное не поняли..) Мне надо что бы на другом сайте показывало онлайн етот игрок или нет? или я вас не понял. что мне ето даст?


<tr><td style="height:26px; width:70px; text-align:left; vertical-align:bottom; border-bottom:1px solid #f6f3ec;">Статус</td><td style="text-align:left; vertical-align:bottom;"><span style='color:green;'>Online</span></td></tr>

Да скорее всего вы меня не поняли. Как прочитать страницу по урлу написал вам Veseloff.

Далее, т.к. строка достаточно уникальна, просто проверяем на её наличие если есть, то у себя сохраняем как статус онлайн, если нет - оффлайн

Share this post


Link to post
Share on other sites

:) в html я как то шарю, а вот php совсем тьма...можете на примере показать?


$string = "Искомая строка";
$url = "http://адрес_страницы";
$page = file_get_contents($url);
if(stripos($page, $string)) Echo "Юзер онлайн";

file_get_contents()

stripos()

Share this post


Link to post
Share on other sites

Большое спасибо!)

stripos() это для того что бы не считывать каждый раз всю страницу? не понял я чего то..

мне надо что бы при онлайн отображалась одна картинка, а прри оффлайн другая

как это можно сделать правильно? у меня только это получилось


<?php $string = "<span style='color:green;'>Online</span>";
$url = "http://murdrum.ru/char/Obscurus";
$page = file_get_contents($url);
if(stripos($page, $string)) Echo '<img src="image/ONLINE.GIF" width="7" height="7" /> <a href="http://murdrum.ru/char/Obscurus">Obscurus</a>';?>

<?php $string = "<span style='color:darkred;'>Offline</span>";
$url = "http://murdrum.ru/char/testdrive";
$page = file_get_contents($url);
if(stripos($page, $string)) Echo '<img src="image/OFFLINE.GIF" width="7" height="7" /> <a href="http://murdrum.ru/char/Obscurus">Obscurus</a>';?>

на странице будет около 30 таких статусов...грузит жутко долго..как-нибудь можно ето упростить?

Edited by MefistofeleS

Share this post


Link to post
Share on other sites

Давайте ссылку на страницу, которую нужно спарсить — попробую что-нибудь посмотреть. Кстати, а администрация сайта не против, что вы будете оттуда что-то получать?

Share this post


Link to post
Share on other sites

Давайте ссылку на страницу, которую нужно спарсить — попробую что-нибудь посмотреть. Кстати, а администрация сайта не против, что вы будете оттуда что-то получать?

Нет, мы делаем сайт гильдии из этой игры а берем только статусы игроков)

http://murdrum.ru/char/obscurus

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

<img src="image/ONLINE.GIF" width="7" height="7" />

<img src="image/ONFFLINE.GIF" width="7" height="7" />

В общем то работает...но страницу грузит более минуты т.к. таких статусов он считывает около 30 штук

Share this post


Link to post
Share on other sites

Окей. Я бы сделал так. Пишем скрипт по такому принципу:

1. Создаём массив игроков. Например, в БД.

CREATE TABLE `playes` (`name` VARCHAR(50), `status` ENUM('online', 'offline'), KEY `name` (`name`))ENGINE=MyISAM

2. Делаем выборку из этой таблицы

SELECT `name` FROM `players`

3. Чтобы понять онлайн игрок или нет нам надо найти в странице следующие вхождения

<span style='color:green;'>Online</span>

если человек онлайн

<span style='color:darkred;'>Offline</span>

если нет. Поскольку варианта всего два, то ограничимся всего одним поиском.

4. Итак, для каждой записи получаем содержимое страницы при помощи file_get_contents(), потом ищем вхождение нужной нам подстроки при помощи strpos().

5. Результат записываем в БД.

6. Скрипт ставим на запуск, допустим, каждые пять минут (или сколько там надо?) любым планировщиком.

7. При загрузке страницы просто получаем статусы игроков из БД.

Всё, готово.

Share this post


Link to post
Share on other sites

Я и так всё на объяснил максимально подробно, подробнее уже некуда. Я могу и вообще весь код написать. Не бесплатно, конечно.

Share this post


Link to post
Share on other sites

А как отыскать элемент с динамически меняющимся содержимым? Например, есть таблица топ игроков, и нужно найти игрока с рейтингом "1". А потом выводить его ник, другие данные.

Найти ячейку с рейтом "1" можно, а остальные та будут меняться...

<tr>
<td>Рейтинг</td>
<td>Ник</td>
<td>Статус</td>
<td>...</td>
</tr>

Edited by grafnet

Share this post


Link to post
Share on other sites

А как отыскать элемент с динамически меняющимся содержимым? Например, есть таблица топ игроков, и нужно найти игрока с рейтингом "1". А потом выводить его ник, другие данные.

Найти ячейку с рейтом "1" можно, а остальные та будут меняться...

<tr>
<td>Рейтинг</td>
<td>Ник</td>
<td>Статус</td>
<td>...</td>
</tr>

Используйте для этого регулярные выражения preg_match()

Share this post


Link to post
Share on other sites

Используйте для этого регулярные выражения preg_match()

или если с регулярками тяжко, можно как вариант через xPath попробовать. хотя в php работа с Dom тоже не сахар...

Share this post


Link to post
Share on other sites

Попробовал так:

<?php
$url = "http://myurl.ru/";
$file = file_get_contents($url);
preg_match("#<td.*><a.*>(.*)</a></td>#u", $file, $usr);
$u = $usr[1];
echo $u;

В результате получил первое совпадение. А как получить еще два (или более) совпадений? Если через preg_match_all, то как тогда ограничить результаты совпадений до N-го количества? Подскажите плз.

Edited by grafnet

Share this post


Link to post
Share on other sites

Да не ограничивай, потом из массива возьмёшь нужные и всё

Share this post


Link to post
Share on other sites

Не ограничевать? А если у меня 1000 совпадений из которых нужны только первые 3? Тогда лишние 997 значений тоже попадут в массив. Разве это не замедлит работу скрипта?

Edited by grafnet

Share this post


Link to post
Share on other sites

Тогда

preg_match('/^(Искомый шаблон)(.+)$/isu',$str,$matches);
$found=$matches[1];
$str=$matches[2];

Выполнять в цикле

Share this post


Link to post
Share on other sites

Что-то никак не пойму, как его выполнить в цикле?

<?php
$url = "http://myurl.ru/";
$file = file_get_contents($url);
while( ? )
{
preg_match("#<td.*><a.*>(.*)</a></td>#u", $file, $usr);
$found = $usr[1];
$str = $usr[0];
}

Share this post


Link to post
Share on other sites

Что-то никак не пойму, как его выполнить в цикле?

если первые три, цикл со счётчиком использовать. for().

Share this post


Link to post
Share on other sites

<?php
$url = "http://myurl.ru/";
$file = file_get_contents($url);
$found=array();
for ($__=0; $__ < 3; $__++)
{
preg_match("#<td.*><a.*>(.*)</a></td>(.+)$#su", $file, $usr);
$found[] = $usr[1];
$file = $usr[2];
}
?>

Я имел в виду что-то такое

//Вот же дурной хайлайтер

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Member Statistics

    46,551
    Total Members
    3,128
    Most Online
    Илья92
    Newest Member
    Илья92
    Joined
  • Recently Browsing   0 members

    No registered users viewing this page.