Подопытный - это мой сайт
Решил с простенького: со всех страниц моего сайта спарсить название страниц(то, что между тегом h1, он у меня один на странице)
Все старницы взял с sitemap.xml
ну и каждую страницу загонял в переменную функцией file_get_contents и потом регуляркой брал, то что мне надо.
в итоге получилось вот такое чудо - сам граббер (де-то минуту-две парсит данные)
и сам код граббера:
<?php
echo "
<style>
h1{font-size: 16px;}
table{
padding: 0!important;
font-size: 12px;
color: #6E9F17;
border-collapse: collapse;
}
td{
padding: 5px;
border: 2px solid #e5e5e5;
}
tr:hover{background-color: #efefef;}
</style>\n
";
$contents = file_get_contents('http://www.gistoryja.ru/sitemap.xml');
preg_match_all("/[<][l][o][c][>].*.[<][\/][l][o][c][>]/",$contents, $c);
$i = count($c[0])-1;
while ($i != 0)
{
$c[0][$i] = strip_tags($c[0][$i]);
$contents = file_get_contents($c[0][$i]);
preg_match("/[<][h][1][>].*.[<][\/][h][1][>]/",$contents, $array);
$i2 = 0;
$array2[] = $array[$i2];
$i2++;
$i--;
}
echo '<table width="100%">';
foreach ($array2 as $item)
{
echo "<tr>";
echo '<td>' . $item . '</td>';
echo "</tr>";
}
echo '</table>';
У меня вопрос: чего он так долго парсит? Можно как-нибудь увеличить скорость работы парсера?
Я примерно правильно всё сделал или есть способы парсинга получше?
Спустя 1 час, 12 минут, 47 секунд (22.07.2012 - 22:43) Лена написал(а):
Цитата |
Можно как-нибудь увеличить скорость работы парсера? |
1. Поменять регулярное выражение
/<loc>.*?<\/loc>/
/<loc>[^<]+<\/loc>/
2. Оптимальный способ. Использовать как встроенные php-разборщики xml, так и вручную написанные библиотеки - в сети их готовых много.
Среди встроенных можно посмотреть и написать свой код:
а) xml_parser_create(), xml_parse() и т.д.
б) Расширение SimpleXML
в) средства модели DOM - simplexml_load_string(), dom_import_simplexml() и т.д.
Спустя 37 минут, 13 секунд (22.07.2012 - 23:20) Winston написал(а):
Можно еще так сделать
Поначалу за 20 сек. отрабатывало, а потом по минуте стало... И начало выдавать заголовки Service Temporarily Unavailable.
Видимо за DDOS'ера меня приняли :D
Свернутый текст
<?php
header("Content-Type: text/html; charset=utf-8");
set_time_limit(0);
$start = microtime(true);
$xml = simplexml_load_file('http://www.gistoryja.ru/sitemap.xml'); // Получаем список URL'ов
ob_start();
$links = array();
foreach($xml AS $item)
$links[] = trim($item->loc); // Массыв URL'ы
$headers = array();
$countLinks = sizeof($links); // Количество URL'ов
$cmi = curl_multi_init(); // Инициализация сеанса мультикурл
for($i = 0; $i < $countLinks; $i++)
{
$cis[] = curl_init($links[$i]); // Создаем отдельный сеанс для каждой страницы
curl_setopt($cis[$i], CURLOPT_RETURNTRANSFER, true); // Возвращаем страницу
curl_multi_add_handle($cmi, $cis[$i]); // Добавляем дескрипторы каждой страницы в общую корзину (набор)
}
$run = null;
do
$cme = curl_multi_exec($cmi, $run); // Выполняем запросы пока в наборе есть еще ссылки
while($run > 0);
for($i = 0; $i < $countLinks; $i++)
{
$page = curl_multi_getcontent($cis[$i]); // Получаем страницу
preg_match("#<h1>(.*)</h1>#isuU", $page, $matches); // Достаем заголовки
if(isset($matches[0]))
$headers[] = $matches[0];
curl_multi_remove_handle($cmi, $cis[$i]); // Удаляем дескриптор для только что выполненого сеанса
}
curl_multi_close($cmi); // Завершаем мультисеанс
echo "
<style>
h1{font-size: 16px;}
table{
padding: 0!important;
font-size: 12px;
color: #6E9F17;
border-collapse: collapse;
}
td{
padding: 5px;
border: 2px solid #e5e5e5;
}
tr:hover{background-color: #efefef;}
</style>\n
";
echo '<table width="100%">';
foreach ($headers as $item)
{
echo "<tr>";
echo '<td>' . $item . '</td>';
echo "</tr>";
}
echo '</table>';
$html = ob_get_contents();
ob_end_clean();
$end = microtime(true);
echo $html;
echo '<br/><br/>TIME: ' . ($end - $start);
Поначалу за 20 сек. отрабатывало, а потом по минуте стало... И начало выдавать заголовки Service Temporarily Unavailable.
Видимо за DDOS'ера меня приняли :D
Спустя 1 день, 16 часов, 42 минуты, 51 секунда (24.07.2012 - 16:03) bayanruby написал(а):
ддосер... ![biggrin.gif](http://phpforum.su/html/emoticons/biggrin.gif)
Да, видать есть много способов) буду курить темы, спасибо.
![biggrin.gif](http://phpforum.su/html/emoticons/biggrin.gif)
Да, видать есть много способов) буду курить темы, спасибо.
Спустя 2 часа, 45 минут, 23 секунды (24.07.2012 - 18:48) vital написал(а):
Winston
И не лень же было..
И не лень же было..
Спустя 2 минуты, 40 секунд (24.07.2012 - 18:51) Winston написал(а):
Цитата (vital @ 24.07.2012 - 18:48) |
Winston И не лень же было.. |
У меня был уже этот скрипт, просто несколько правок сделал и выложил, а с нуля писать, для примера, не стал бы.