В общем задался вопросом перейти со старенького 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);
?>