|
|
|
|
|
для: 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 Но это так придирки, в целом все нормально и работоспособно. | |
|
|
|
|
|
|
|
для: 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, $out, PREG_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();
?>
|
| |
|
|
|
|
|
|
|
для: PilotGarry
(27.11.2008 в 14:35)
| | Действительно не понятно логика взаимодействия счетчика $i из первого цикла while и внутреннего цикла for. Даже если все работает как надо - очень уж хитро получается и требует времени на разбор логики. Лучше вообще разделить логику разбора страницы (создав для этого отдельную функцию) и логику формирования ссылок. | |
|
|
|
|
|
|
|
для: PilotGarry
(27.11.2008 в 14:35)
| | помойму $i вы 2 раза 3ря использовали....
и автоинкримента 1й $i я не вижу | |
|
|
|
|
|
|
| Тренируюсь сейчас в извлечении ссылок из выдачи поисковиков. Для начала решил поработать с Яндексом.
За основу взял скрипт из книги "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, $out, PREG_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);
}
?>
|
Спасибо! | |
|
|
|
|