[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Написал свой первый граббер...
bayanruby
Решил попрактиковаться.

Подопытный - это мой сайт
Решил с простенького: со всех страниц моего сайта спарсить название страниц(то, что между тегом 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 написал(а):
Можно еще так сделать

Свернутый текст
<?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

Да, видать есть много способов) буду курить темы, спасибо.

Спустя 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
И не лень же было..


У меня был уже этот скрипт, просто несколько правок сделал и выложил, а с нуля писать, для примера, не стал бы.
Быстрый ответ:

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