Мен, если тебе нужно сразу много парсить страничек, то тут есть несколько вариантов, а именно 2: 1) Циклом ты оперируешь двумя операциями: а) проход по ссылке с помощью сокетов б) парсинг тела 2) Используешь многопоточный курл, экономишь дофига времени и получаешь нужный результат Немного цифр: имеется 1000 страниц, каждая загружается за 2 секунды: 1) первым вариантом это будет 1000 х 2 = 2000 секунд + время на парсинг 2) вторым вариантом это будет 2 секунды + время на парсинг А все потому, что сокеты для многопотока неподойдут. Нет, можно конечно сделать скрипт "оператор" на сокетах + скрипт, который бы 1000 этих "операторов" вызывал одномоментно, но это, так сказать, костыли. По теме: кури в сторону функций curl_multi_init(), curl_init(), curl_setopt(), curl_multi_exec()... //Gifts: хочется помочь бесплатно - пишите сюда, не стесняйтесь. Платно - пишите ему в личку и чтобы в разделе этого не видел. Считайте предупреждением
4XE До тех пор пока вы скрипты не пишете, а находите, и просите чтобы их вам улучшили вместо вас - вам здесь не рады. Почитайте книжки по основам программирования. Например о циклах, чтении из файла и прочем |qbz| Можете считать занудой, но на сокетах тоже можно "2 секунды + время на парсинг"
Gifts, Я не прошу написать а лишь посоветовать, с помощь каких функций можно решить ту или иную задачу.. |qbz|, спасибо, об curl мне известно, граберы с использованием curl я так же встречал в интернетах.. и так с загрузкой базы из файла я разобрался. а вот с циклами мягко говоря ерунда получается PHP: <?php function input_into($text) { $a_file=fopen("./grab_output.txt","a+"); fputs($a_file,"$text"); fclose($a_file); } function get_URL_by_socket ($host,$path) { //Получает URL $path с хоста $host через сокеты. $fp = fsockopen($host, 80); if (!$fp) { die ("Не могу получить данные с url http://$host/$path"); } else { $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"; fwrite($fp, $out); $headers = ""; while ($str = trim(fgets($fp))) $headers .= "$str\n"; $body = ""; while (!feof($fp)) $body .= fgets($fp); input_into($body); fclose($fp); } return $body; } function process($s,$start,$end,$include) { //Парсит полученный файл - здесь-то и пишется главное //У нас это извлечение содержимого от $start до $end $s1=strpos ($s,$start); $s2=strpos ($s,$end); if (!is_integer($s1)) { return "Не найден начальный сегмент: ".htmlspecialchars($start); } if (!is_integer($s2)) { return "Не найден конечный сегмент: ".htmlspecialchars($end); } if ($s1>$s2) { return "Конечный сегмент предшествует начальному"; } if ($include) { //Включать начало и конец return substr ($s,$s1,$s2-$s1+strlen($end)); } else { //Исключить начало и конец $s1+=strlen($start); return substr ($s,$s1,$s2-$s1); } } function parser ($host,$path,$start,$end,$include) { //Основной вызов парсера: //$host, $path - хост без http://www. и путь к файлу, начиная с / //$start, $end - строки начала и конца извлекаемого содержимого //$include - если true, включать в вывод строки $start и $end static $first=true; $s= get_URL_by_socket ($host,$path); if ($first) { //Заголовок посылается только при 1-м вызове $first=false; //Если вызывается из "движка" - можно убрать этот блок header('Conte nt-type:text/html;charset=windows-1251'); } return process($s,$start,$end,$include); } $file = file ("./url.txt"); foreach($file as $to){ ///почему-то работает только ссылка из последней строки, остальные же $host="sitename.ru"; ///выдают ошибку(о том что страница не имеет нужных тегов), при подстановке в $path= "$to"; ///код. $start="<body>"; $end="</body>"; $include=false; print parser ($host,$path,$start,$end,$include); } почему-то работает только ссылка из последней строки, остальные же выдают ошибку(о том что страница не имеет нужных тегов), при подстановке в код. Собственно вопрос, почему так?
Доброе утро. Есть ли какая нить готовая функция которая при определенном условии в цикле foreach повторяет последнее действие еще раз? То есть имеем цикл foreach ($arr as $key) { // тут подключаемся по определенному урлу и если в ответе сервера нету нужного // нам пробуем еще раз повторить это же действие цикла }
Можно, у меня пара скриптов только на сокетах и стоит, так как курл с подобными задачами не справляется. Просто я хотел человеку донести, что в его случаях оптимальнее юзать курл. Оффтоп: вот незнаю, но мне почему-то смешно от вашей мелочности, уважаемый Gifts )
4XE При чтении из файла в массив с помощью функции file() в конце каждой строки (быть может последней) остаются символы перевода строки, от них надо избавляться с помощью функции trim() Rastamanka выделите тело цикла в отдельную функцию и в зависимости от возвращаемого значения - выполняйте. А ответ на ваш вопрос - специализированных конструкций для этого нет. |qbz| Просто еще не натыкались, или принимаете как должное. Но дьявол действительно кроется в деталях AnGeI Возможность реализации любого протокола без ограничений. У курла есть некоторые болячки, которые надо тяжело обходить.
Не ставится кодировка utf-8 ,в исходном коде присутсвует.. браузер видит как 1251 PHP: <?php $ch = curl_init(); $header[0] = "Content-type: text/xml; charset=utf-8"; curl_setopt($ch,CURLOPT_HTTPHEADER,$header); curl_setopt($ch,CURLOPT_URL,'www.mail.ru'); curl_setopt($ch,CURLOPT_USERAGENT,'Opara/1.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_exec($ch); curl_close($ch); echo $ch; ?>
Metal-Core Простите, но вы, надеюсь, не ожидаете, что такая конструкция заставит пхп отправить нужный заголово по волшебству? PHP: $header[0] = "Content-type: text/xml; charset=utf-8"; Используйте PHP: header("Content-type: text/xml; charset=utf-8");
Есть данные типа Code: <part1>data</part1> <part2>data</part2> <part3>data</part3> Как на ПХП сделать так что бы они не повторялись ? т.е идет 1 2 3, потом идет 4 5 6, 7 8 9, как сделать так что бы можно было генерировать ? я понимаю что это в цикле но я не знаю как кадый раз прибавлять нужно или как ? т.е логику я понимаю что может это и просто мат не шарю )
Не смешно : ) Code: <part1>data</part1> <part2>data</part2> <part3>data</part3> потом вот так Code: <part4>data</part4> <part5>data</part5> <part6>data</part6> Там не просто 1 2 3 4 5 6 идет построчно - а идут цифры которые повторяються в начале и конце тегов
Adio Вас ОЧЕНЬ тяжело понять. Вы вначале решите что вам нужно, а потом напишите это. А после написания спросите кого-нибудь знакомого - понял ли он вас.
Code: <part1>data</part1> <part2>data</part2> <part3>data</part3> что тяжелого ? Вы не видете тегов ? Вопрос был в том как сгенерировать такие теги по возврастанию цифер, но проблема в том что эти цифры на оба концах тегов т.е т.е у нас к примеру есть тег Code: <part1>data</part1> нужно сгенирировать таких 10 штук что мы получаем Code: <part1>data</part1> <part2>data</part2> и так до десяти..
Adio, вас дейстаительно не понять. что вас не устраивает в коде который дал GRRRL Power ?? код PHP: <?php for($i = 1; $i <= 9; ++$i) echo "<part$i>data</part$i>\n"; ?> результат <part1>data</part1> <part2>data</part2> <part3>data</part3> <part4>data</part4> <part5>data</part5> <part6>data</part6> <part7>data</part7> <part8>data</part8> <part9>data</part9> разве не то что вам нужно?
аа забылллллл вот Code: <good1>data</good1> <bad2>data</bad2> <ok3>data</ok3> Этот код изначально есть ! Понял почему вы не поняли и где ошибся я.. Нужно генерировать по три к примеру столбца т.е в генерации это будет выглядить так Code: <good1>data</good1> <bad2>data</bad2> <ok3>data</ok3> <good4>data</good4> <bad5>data</bad5> <ok6>data</ok6> <good7>data</good7> <bad8>data</bad8> <ok9>data</ok9>
<?php $i = 1; $b = 0; while($i<=9) { $b++; if($b==1) echo "<good".$i.">data</good".$i.">\n"; if($b==2) echo "<bad".$i.">data</bad".$i.">\n"; if($b==3) {echo "<ok".$i.">data</ok".$i.">\n"; $b=0; } $i++; } ?>
Adio PHP: <?php for($i = 1, $j = 2, $c = 3; $c <= 9; $i += 3, $j += 3, $c += 3) { echo "<good".$i.">data</good".$i.">\r\n"; echo "<bad".$j.">data</bad".$j.">\r\n"; echo "<ok".$c.">data</ok".$c.">\r\n\r\n"; } Adio, это просто ужасно! Даже если захочешь, то не получится структурировать речь подобным образом. Извини конечно, но я все же поинтересуюсь. Неужто и в реальной жизни ты так же выстраиваешь предложения? Или может ты из далеких стран и русский язык для тебя не родной?