[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск значения в коде html и запись в файл(базу)
tolkodelo
Добрый день,

Хочу для нескольких своих сайтов сделать страничку с текущим положением в рейтинге, например, webomer. Для того, чтобы в будущем писать, скажем, историю изменения позиции в рейтинге по дням/месяцам. (и чтобы все это отображалось у меня на страничке!)

Текущая задача написать код, который бы искал в коде html-странички позицию в рейтинге и записывал его в файл (или базу mysql).

Страничка, например, вот такая


строка, в которой содержится искомые данные

put_one_site_stat('1262128','krasnoyarsk-fire.ru','','87358','87 358','0.00252','','','81','19','3','24');


87358 - искомые данные (причем учтите, что это число постоянно меняется, количество знаков может тоже измениться, так что видимо мы ищем все, что начинается с некоторой позиции после .ru (пропуская ','',') и до следующего '

В php новичок, хотя потихоньку разбираюсь. Вариантов того, как сделать, видел много, в том числе и на этом форуме, но что-то все не складывается в цельную картину для моего конкретного случая.

Будьте добры, подскажите направление движения (только не к выходу! B) )
Я напишу код и выложу.

>>Спасибо!<<



Спустя 1 день, 8 часов, 11 минут, 39 секунд (24.08.2011 - 13:55) tolkodelo написал(а):
Что-то тишина... Ужель никто не поможет? sad.gif

Спустя 1 час, 7 минут, 23 секунды (24.08.2011 - 15:02) inpost написал(а):
tolkodelo
Через file_get_contents() можно получить содержание необходимой тебе страницы. Если нужно авторизироваться, то curl(!).
Далее регуляркой вытащить данные. Сначала попробуй простую строку вытянуть, потом сложнее, и так далее.
preg_match - поиск по регулярке.
Изучить регулярку можно тут: http://irbis-team.com/15/20

Спустя 1 минута, 42 секунды (24.08.2011 - 15:04) neadekvat написал(а):
Цитата (inpost @ 24.08.2011 - 16:02)
Через file_get_contents() можно получить содержание необходимой тебе страницы. Если нужно авторизироваться, то curl(!).

К слову, у file_get_contents() тоже есть такая вомзожность (третий параметр - context). Но удобнее все это делать через curl, конечно же.

Спустя 56 минут, 8 секунд (24.08.2011 - 16:00) tolkodelo написал(а):
Благодарю за уделенное внимание!
Спасибо, neadekvat; спасибо,inpost!

Сейчас попробую ваши советы, что получится выложу.

С curl работал, правда сохранял страницу в файл.

Респект и поклон cool.gif

Спустя 3 дня, 3 часа, 17 минут, 43 секунды (27.08.2011 - 19:18) tolkodelo написал(а):
Вот интересно.
Разбираюсь с preg_match. Пробую для начала найти что-нибудь в файле
Такой код:

$file="http://www.___________/text.txt";
$source=fopen($file, "r");
$string='abcdef';
$lookup=preg_match("#.+#i", $string);
if ($lookup==1) {echo 'text found';} else {echo 'text NOT found';};
fclose($source)


если пишу
$lookup=preg_match("#.+#i", $string); пишет text foud
А пишу
$lookup=preg_match("#.+#i", $source) пишет "text not found"

Ошибка в ДНК?

Спустя 43 секунды (27.08.2011 - 19:18) tolkodelo написал(а):
да, в текстовом файле содержится текст "sed"

Спустя 2 минуты, 16 секунд (27.08.2011 - 19:21) inpost написал(а):
tolkodelo
Проверку лучше так делать:
if(preg_match("#.+#i",$string))
echo 'true';
else
echo 'false';

Спустя 18 минут, 3 секунды (27.08.2011 - 19:39) neadekvat написал(а):
А чем вам strlen не нравится?
Зачем модификатор i?

Спустя 5 часов, 12 минут, 26 секунд (28.08.2011 - 00:51) walerus написал(а):
Я либо по ночи начинаю подтупливать, НО, смотрю его код/пример:
 
$file="http://www.___________/text.txt";
$source=fopen($file, "r");
$string='abcdef';
$lookup=preg_match("#.+#i", $string);
if ($lookup==1) {echo 'text found';} else {echo 'text NOT found';};
fclose($source)


Разбираем построчно.
1) указали где находится файл для обработки.
2) открываем файл, вот тут я начал уже "загонять", зачем открывать файл, если по коду он дальше не используется ?? (Переменная $source встретилась только 2ва раза, а не три, куда делся fwrite(); ?)
3) Присваиваем переменной $string - текст " abcdef ", тут все понятно, будем искать этот текст в файле.
4) Пытаемся найти любой символ/ы в строке!!!, а не в файле как хотелось.
5) Теперь проверяем что вернул preg_match - true или false, в зависимости от результата - выводим мессадж.
6) Закрыли файл. Опять же, так и не понял к чему он был открыт, если нигде не участвовал...

По моему, должно быть как то так:

$file = "http://www.___________/text.txt"; // Адрес где хранится файл
$file_data = file_get_contents( $file ); // Получили данные ИЗ файла
$string = 'abcdef'; // Искомый текст или текст который будем искать, кому как удобнее
if ( preg_match( "#.*" .$string. ".*#i", $file_data ) )
echo 'text found';
else
echo 'text NOT found';

Спустя 5 минут, 3 секунды (28.08.2011 - 00:56) walerus написал(а):
Цитата (neadekvat @ 27.08.2011 - 16:39)
А чем вам strlen не нравится?
Зачем модификатор i?

strlen - помому немного не в тему, он же не ищет ничего, а определяет длину строки.
Модификатор " i " - Включение режима case-insensitive. ( Большие маленькие буквы - все одно )

Спустя 2 часа, 17 минут, 20 секунд (28.08.2011 - 03:13) tolkodelo написал(а):
Цитата (walerus @ 27.08.2011 - 21:51)
Опять же, так и не понял к чему он был открыт, если нигде не участвовал...

Я ниже в том же сообщении написал, что ставлю либо $source, либо $string. Т.к. при указании
$lookup=preg_match("#.+#i", $source)

выводилось мое сообщение, что текст не найден.

Так, смотрю ваши замечания дальше...

Спустя 26 минут, 37 секунд (28.08.2011 - 03:40) neadekvat написал(а):
Цитата (walerus @ 28.08.2011 - 01:56)
strlen - помому немного не в тему, он же не ищет ничего, а определяет длину строки.

Так а зачем нам что-то искать? Мы проверяем, есть ли какой-то текст в файле. Если длина текста будет равна нулю, значит, текста нет.

Цитата (walerus @ 28.08.2011 - 01:56)
Модификатор " i " - Включение режима case-insensitive. ( Большие маленькие буквы - все одно )

Гм. Ты серьезно решил, что я спрашиваю назначение модификатора? Я спрашиваю, зачем он здесь, в этой регулярке? Что изменится, если его убрать?

Спустя 6 часов, 56 минут, 53 секунды (28.08.2011 - 10:37) walerus написал(а):
tolkodelo - в твоем $source и не будет ничего находиться, потому что это "поток" открытого файла, а не его содержание, для получения содержания как писал выше inpost, нужно использовать file_get_contents( $file );


neadekvat
Цитата
Гм. Ты серьезно решил, что я спрашиваю назначение модификатора? Я спрашиваю, зачем он здесь, в этой регулярке? Что изменится, если его убрать?

Ну точно ночь сказалась, я вообще по другому понял задание которое ТС хотел показать в примере, я так понял он $string искал в $source, а он вообще просто что либо искал... Тогда согласен! с тобой, модификатор не нужен, и strlen тоже подходит, так тогда можно и trim( $file ) сделать )), и проверить на пустоту.

Как то странно, по первому посту, вообще проблем нету.
1) получить строку...
put_one_site_stat('1262128','krasnoyarsk-fire.ru','','87358','87 358','0.00252','','','81','19','3','24');
, получили
2) Разбить ее по запятой... $tmp_array = explode( ',', $string );

[0] = put_one_site_stat('1262128'
[1] ='krasnoyarsk-fire.ru'
[2] = ''
[3] = '87358'
[4] = '87 358'
[5] = '0.00252'
[6] = ''
[7] = ''
[8] = '81'
[9] = '19'
[10] = '3'
[11] = '24');

и взять то что нужно.
3) $result = trim( str_replace("'", '', $tmp_array[3] ) );
.
.
.
4) Проверить есть ли данные и занести в файл(базу)...

Спустя 1 час, 31 минута, 51 секунда (28.08.2011 - 12:09) tolkodelo написал(а):
walerus, да, правда, я уже допетрил про fopen smile.gif

Ух ты! Попробую сейчас на практике сделать.

а модификатор я ставил в процессе изучения smile.gif просто убрать забыл перед тем, как выкладывать код.

Цитата
Как то странно, по первому посту, вообще проблем нету.


Ну ведь невежливо просить сделать твою работу за тебя, правильно? Тем более, что это азы.

Сейчас попробую написать код и разобраться, как работает.

Спустя 4 часа, 13 минут, 49 секунд (28.08.2011 - 16:23) tolkodelo написал(а):
Вот что у меня получилось с помощью вашей и Google:

скрипт берет значения и пишет в html-страничку . А мне выдает страничку-отчет.


<?php
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru-RU"><head><title>Статистика сайтов</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>'
;


// СОЗДАЕМ НОВЫЙ ПУСТОЙ ФАЙЛ И ДЕЛАЕМ ЗАГОТОВКУ ДЛЯ ВЕБ-СТРАНИЦЫ

$file=fopen("index.html","a+");
if ($file!=false) {echo "Файл открыт успешно";} else {echo "Файл не открыт"; die ();};
flock($file,LOCK_EX);
ftruncate($file, 0);

$info='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru-RU"><head><title>Статистика сайтов</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><table border="2px" cellpadding="2px" frame="border">'
;

fwrite($file,$info);
if (fwrite($file,$info)) {echo "<br />Файл изменен успешно";} else {echo "<br />Файл не открыт"; die ();};
flock($file,LOCK_UN);
fclose($file);

//БЕРЕМ СПИСОК ФАЙЛОВ И ПИШЕМ В МАССИВ

$spisokurl="http://trynyty.ru/besplatnoe-prodvizhenie/";
$spisok_data = file_get_contents( $spisokurl );
$beginning0 = strripos($spisok_data, 'slide_toggle_content" style="display: none;');
$end0 = strripos($spisok_data, '<div class="widget widget_latest_posts">');
$length0 = $end0-$beginning0;
$spisok=substr($spisok_data, $beginning0, $length0);
preg_match_all("/http\:\/\/{1,200}?([^\/]+)/", $spisok, $urls);
$spisok_array=$urls[1];

//СОЗДАЕМ ТАБЛИЦУ ПРОВЕРОК

echo '<br /><p>Ведем запись в файл новых значений</p><br /><table border="2px" cellpadding="2px" frame="border">';

foreach ($spisok_array as $i) {

//получили исходный код страницы для элемента i

$url="http://webomer.ru/cgi-bin/wr.fcgi?action=stat&period=month&sitet=all&cou ntry=2&region=&category=&key={$i}";
$page_data = file_get_contents( $url );

//получили из кода строку

$beginning=strripos($page_data, "put_one_site_stat");
$end=strripos($page_data, "');")+3;
$length=$end-$beginning;
$string=substr($page_data, $beginning, $length);

//получили из строки данные

$tmp_array = explode( ',', $string );
$result = trim( str_replace("'", '', $tmp_array[3] ) );

//ПИШЕМ ДАННЫЕ НА СТРАНИЦУ

$file1 = fopen("index.html","a+");
flock($file1,LOCK_EX);
$info1="<tr><td>$i</td><td>$result</td></tr>";
echo "<tr><td>" . $i . "</td>";
$write=fwrite($file1, $info1);
if ($write) {echo "<td>OK</td>";} else {echo "<td>-Запись значения НЕ произведена</td>";};
echo "</tr>";
flock($file1,LOCK_UN);
fclose($file1);

}; // конец цикла foreach

unset($i);
echo "</table>";

$file2 = fopen("index.html","a+");
flock($file2, LOCK_EX);
$info2='</table></body>';
fwrite($file2, $info2);
flock($file2, LOCK_UN);
fclose($file2);

echo '<br /> Конец программы!';
?>


Посмотрите, нет ли сильно корявых решений? :) сомневаюсь насчет flock, но это просто мой скртиппт с fopen не работал, я взял из одного файла рабочий скрипт.

Для некоторых доменов почему-то не вывелась статистика (смотрите результат тут)

И кстати: можно ли сделать, чтобы данный скрипт запускался, скажем, раз в сутки без моего участия ?

Спасибо!

Спустя 14 часов, 11 минут, 34 секунды (29.08.2011 - 06:34) tolkodelo написал(а):
Понял, почему не вывелась статистика:

поиск проходит следующим образом

preg_match_all("/http\:\/\/{1,200}?([^\/]+)/", $spisok, $urls);


Ищет sait.su в строке ....http://www.sait.ru/ <br />.....

Но иногда строка выглядит так: ....http://www.sait.ru<br />.....

Ну и соответственно результат поиска выглядит не как sait.ru а как sait.ru<br дальше не забирается статистика.

Как бы это побороть?

Спустя 4 дня, 3 часа, 38 минут, 19 секунд (3.09.2011 - 10:12) tolkodelo написал(а):
Хорошо, с этим я разобрался, с вашей помощью, и даже могу показать результат.

Теперь вопрос, который, я думаю, для настоящих профессионалов.

Есть сервис, осуществляющий поиск по базе законодательства. Не знаю, как он делает сам поиск и генерирует файл, только управление осуществляется у него как в приложениях windows - кнопками.

Когда нажимаешь кнопку "сохранить на компьютере", появляется запрос на скачивание файла. Смотрел ссылку на скачивание в лисе - ведет в папку cache на том сайте, плюс через некоторое время перестает действовать (кэш ведь).

Можно ли сделать так, чтобы скрипт "заходил" на страницу, "нажимал" там на кнопку и записывал ко мне скомпилированный файл? В каком направлении надо действовать?

Если хотите, дам адрес сайта и доп информацию.

Спасибо!

Спустя 2 дня, 6 часов, 29 минут, 31 секунда (5.09.2011 - 16:42) tolkodelo написал(а):
Никого нету....

(с) Маша и медведь

Спустя 6 минут, 35 секунд (5.09.2011 - 16:49) inpost написал(а):
tolkodelo
Надо пробовать, может быть даже curl поможет. То есть ходишь по сайту, парсишь ссылки, в итоге находишь ссылку на файл и его подгружаешь.

Спустя 10 минут, 38 секунд (5.09.2011 - 16:59) tolkodelo написал(а):
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.