PHP, сравнение скорости парсеров?

В общем задался вопросом перейти со старенького php парсера simple_html_dom, на более шустрый.
* интересуют только php парсеры.

Гугл, тостер и прочие ресурсы подсказали что для быстродействия лучше использовать phpQuery либо DiDOM
Написал пару парсеров на Query и на DiDOM и чёт увеличения скорости совсем не ощущаю.

Сделал для всех 3х парсеров, один и тот же скрипт.
И.. simple который все ругают за скорость, выполняет его быстрее.

В общем подскажите может я в чём не прав.
Либо посоветуйте реально шустрый php парсер.

Для теста парсил тостер.
1) получаем список вопросов на главной
2) для каждого вопроса открываем страницу с самим вопросом (для нагрузки и проверки скорости)

Simple Html Dom
<meta http-equiv=Content-Type content="text/html;charset=UTF-8">

<?
set_time_limit(0);
$start = microtime(true);

# cURL для парсера
function dlPage($href)
{
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
	curl_setopt($curl, CURLOPT_HEADER, false);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_URL, $href);
	curl_setopt($curl, CURLOPT_REFERER, $href);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.125 Safari/533.4");
	$str = curl_exec($curl);
	curl_close($curl);

	$dom = new simple_html_dom();
	$dom->load($str);
	return $dom;
}


include_once('simple_html_dom/simple_html_dom.php');
$html=dlPage("https://toster.ru/questions");

foreach($html->find('a[class="question__title-link"]') as $div)
{
	$link=$div->href;
	$name=$div->innertext;
	echo $name." = ".$link."<br>";
	
	$html2=dlPage($link);
}

echo "<hr>".round(microtime(true) - $start, 4);
?>
phpQuery
<meta http-equiv=Content-Type content="text/html;charset=UTF-8">

<?
set_time_limit(0);
$start = microtime(true);

$fake_user_agent = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201";
ini_set('user_agent', $fake_user_agent);

require('phpQuery/phpQuery-onefile.php');


$html=file_get_contents('https://toster.ru/questions');
$document=phpQuery::newDocument($html);

$hentry=$document->find('a.question__title-link');
foreach ($hentry as $el)
{
	$pq = pq($el);
	
	$name=$pq->text();
	$href=$pq->attr('href');
	echo $name." = $href<br>";
	
	$html2=file_get_contents($href);
	$document2=phpQuery::newDocument($html2);
}

echo "<hr>".round(microtime(true) - $start, 4);
?>
DiDOM
<meta http-equiv=Content-Type content="text/html;charset=UTF-8">

<?
set_time_limit(0);
$start = microtime(true);

# эмуляция того что мы не бот
#$fake_user_agent = "Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";
$fake_user_agent = "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201";
ini_set('user_agent', $fake_user_agent);

# подключаем парсер
require_once('DiDom/ClassAttribute.php');
require_once('DiDom/Document.php');
require_once('DiDom/Element.php');
require_once('DiDom/Encoder.php');
require_once('DiDom/Errors.php');
require_once('DiDom/Query.php');
require_once('DiDom/StyleAttribute.php');
require_once('DiDom/Exceptions/InvalidSelectorException.php');
use DiDom\ClassAttribute;
use DiDom\Document;
use DiDom\Element;
use DiDom\Encoder;
use DiDom\Errors;
use DiDom\Query;
use DiDom\StyleAttribute;
use DiDom\Exceptions\InvalidSelectorException;
#########################

$document = new Document('https://toster.ru/questions', true);

$posts = $document->find('.question__title-link');
foreach($posts as $post)
{
	echo $post->text(), " = ".$post->href."<br>";
	$document2=new Document($post->href, true);
}

echo "<hr>".round(microtime(true) - $start, 4);
?>
  • Вопрос задан
  • 768 просмотров
Решения вопроса 1
DevMan
@DevMan
львинная доля времени уходит на загрузку страниц, поэтому и неудивительно что заметной разницы не наблюдается.

кто ж так парсит? особенно когда нужна скорость.
сначала готовятся/собираются нужные урлы.
затем они выкачиваются в много потоков (например, мультикурлом) и складываются в базу или на диск или ещё куда.
в фоне уже спокойно парсятся документы локально.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
В общем подскажите может я в чём не прав.


* В том, что тесты нужно запускать много раз, тысячи хотя бы.
* В том, что в измерении времени парсинга вы учитываете время загрузки страницы.
* В том, что вы учитываете время вывода.
* В том, что учитываете время подготовки окружения (инклуды / реквайры).

То, что у вас сейчас получилось - это просто мусорные данные, буквально ничего не значащие.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы