Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Качество написания скрипта.
 
 автор: PilotGarry   (27.11.2008 в 14:35)   письмо автору
 
 

Тренируюсь сейчас в извлечении ссылок из выдачи поисковиков. Для начала решил поработать с Яндексом.

За основу взял скрипт из книги "PHP. Народные советы".
Доработал для того чтобы ссылки извлечь не только с первой, но и из 2,3, ... и др. страниц.

Меня интересует качество написания скрипта, с точки зрения эффективности, красоты кода, т.к. я пока новичек в этом :)

<?php
//извлечение ссылок из ПС Яндекс
// вид ссылки - http://yandex.ru/yandsearch?p=0&text=seo

$i=0;
$fp=fopen ("base.txt","w");

while (
$content file_get_contents ("http://yandex.ru/yandsearch?p=".$i."&text=seo"))

{
// шаблон полной строки со ссылкой
$pattern_full '~<a tabindex=(.*)</a>~smU';

// шаблон ссылки
$pattern_url '~href="(.*)" target~';
// делаем поиск по регулярному выражению
preg_match_all ($pattern_full$content$outPREG_PATTERN_ORDER);


// выводим результат поиска

for ($i 0;$i count($out[1]);$i++)
{
    if (
preg_match ($pattern_url$out[1][$i], $matches))
    {
        
fwrite ($fp,"$matches[1] \r\n");
    }
}
set_time_limit (0);
}
?>


Спасибо!

  Ответить  
 
 автор: MIchail1982   (27.11.2008 в 15:07)   письмо автору
 
   для: PilotGarry   (27.11.2008 в 14:35)
 

помойму $i вы 2 раза 3ря использовали....
и автоинкримента 1й $i я не вижу

  Ответить  
 
 автор: cheops   (27.11.2008 в 15:33)   письмо автору
 
   для: PilotGarry   (27.11.2008 в 14:35)
 

Действительно не понятно логика взаимодействия счетчика $i из первого цикла while и внутреннего цикла for. Даже если все работает как надо - очень уж хитро получается и требует времени на разбор логики. Лучше вообще разделить логику разбора страницы (создав для этого отдельную функцию) и логику формирования ссылок.

  Ответить  
 
 автор: PilotGarry   (27.11.2008 в 22:57)   письмо автору
 
   для: cheops   (27.11.2008 в 15:33)
 

:)
мда... поторопился я скрипт выкладывать.

1. внешний $i- счетчик поменял на $a
2.
// шаблон полной строки со ссылкой
$pattern_full = '~<a tabindex=(.*)</a>~smU';
// шаблон ссылки
$pattern_url = '~href="(.*)" target~';


вынес за цикл. недоглядел...

>Действительно не понятно логика взаимодействия счетчика $i из первого цикла while и внутреннего цикла for.

while - для получения массива строк со ссылками с каждой страницы.
for - для извлечения ссылок из массива и заполнения txt файла.

>Лучше вообще разделить логику разбора страницы (создав для этого отдельную функцию) и логику формирования ссылок.

Не совсем понимаю, как это применить для данного скрипта. Подскажите?

А тем временем у меня получилось вот что:

<?php
###########################################################
#  извлечение ссылок из ПС Яндекс                         #
#  вид ссылки - http://yandex.ru/yandsearch?p=0&text=seo  #
###########################################################
error_reporting (0);
// шаблон полной строки со ссылкой
$pattern_full '~<a tabindex=(.*)</a>~smU';
// шаблон ссылки
$pattern_url '~href="(.*)" target~';

$fp=fopen ("base.txt","w");

# установили указатель на первую страницу в поиске
$a=0;


# в цикле while получаем контент очередной страницы из поиска.
while ($content file_get_contents ("http://yandex.ru/yandsearch?p=".$a++."&text=php"))

{
    
// формируем массив $out с полными строками типа
    
preg_match_all ($pattern_full$content$outPREG_PATTERN_ORDER);

    
// пишем результат поиска в файл
    
for ($i 0;$i count($out[1]);$i++)
    {
        if (
preg_match ($pattern_url$out[1][$i], $matches))
        {
            
fwrite ($fp,"$matches[1] \r\n");
        }
    }
set_time_limit (0);
}

echo 
"выборка закончена"; exit();
?>

  Ответить  
 
 автор: cheops   (29.11.2008 в 13:49)   письмо автору
 
   для: PilotGarry   (27.11.2008 в 22:57)
 

(1) Хм... а почему set_time_limit (0); в цикле? Двиньте его к error_reporting (0);
(2) Хорошо бы обработать открытие файла
<?
  
if($fp)
  {
    
// Файл открыт успешно
  
}
  else
  {
    
// Файл не был открыт
  
}
?>

(3) В error_reporting (0); лучше поменьше установить тревожность, критические ошибки лучше наблюдать.
(4) В файл информацию лучше записывать не построчно в цикле, а сформировать строку и записать её одним fwrite() - и быстрее получится и файл меньше времени можно будет держать открытым (устойчивее получится).

PS Но это так придирки, в целом все нормально и работоспособно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования