سؤال

ما هي مزايا وعيوب المكتبات التالية؟

مما سبق ، لقد استخدمت QP وفشلت في تحليل HTML غير صالح ، و simpledomparser ، وهذا يقوم بعمل جيد ، لكنه يتسرب ذاكرة كيندا بسبب نموذج الكائن. لكن يمكنك الحفاظ على ذلك تحت السيطرة عن طريق الاتصال $object->clear(); unset($object); عندما لا تحتاج إلى كائن بعد الآن.

هل هناك المزيد من الكاشطات؟ ما هي تجاربك معهم؟ سأجعل هذا ويكي المجتمع ، هل سنقوم ببناء قائمة مفيدة من المكتبات التي يمكن أن تكون مفيدة عند الكشط.


لقد أجريت بعض الاختبارات على إجابة بايرون:

    <?
    include("lib/simplehtmldom/simple_html_dom.php");
    include("lib/phpQuery/phpQuery/phpQuery.php");


    echo "<pre>";

    $html = file_get_contents("http://stackoverflow.com/search?q=favorite+programmer+cartoon");
    $data['pq'] = $data['dom'] = $data['simple_dom'] = array();

    $timer_start = microtime(true);

    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $x = new DOMXPath($dom);

    foreach($x->query("//a") as $node)
    {
         $data['dom'][] = $node->getAttribute("href");
    }

    foreach($x->query("//img") as $node)
    {
         $data['dom'][] = $node->getAttribute("src");
    }

    foreach($x->query("//input") as $node)
    {
         $data['dom'][] = $node->getAttribute("name");
    }

    $dom_time =  microtime(true) - $timer_start;
    echo "dom: \t\t $dom_time . Got ".count($data['dom'])." items \n";






    $timer_start = microtime(true);
    $doc = phpQuery::newDocument($html);
    foreach( $doc->find("a") as $node)
    {
       $data['pq'][] = $node->href;
    }

    foreach( $doc->find("img") as $node)
    {
       $data['pq'][] = $node->src;
    }

    foreach( $doc->find("input") as $node)
    {
       $data['pq'][] = $node->name;
    }
    $time =  microtime(true) - $timer_start;
    echo "PQ: \t\t $time . Got ".count($data['pq'])." items \n";









    $timer_start = microtime(true);
    $simple_dom = new simple_html_dom();
    $simple_dom->load($html);
    foreach( $simple_dom->find("a") as $node)
    {
       $data['simple_dom'][] = $node->href;
    }

    foreach( $simple_dom->find("img") as $node)
    {
       $data['simple_dom'][] = $node->src;
    }

    foreach( $simple_dom->find("input") as $node)
    {
       $data['simple_dom'][] = $node->name;
    }
    $simple_dom_time =  microtime(true) - $timer_start;
    echo "simple_dom: \t $simple_dom_time . Got ".count($data['simple_dom'])." items \n";


    echo "</pre>";

وحصلت

dom:         0.00359296798706 . Got 115 items 
PQ:          0.010568857193 . Got 115 items 
simple_dom:  0.0770139694214 . Got 115 items 
هل كانت مفيدة؟

المحلول

اعتدت على استخدام HTML DOM بسيطًا على وجه الحصر حتى أظهر لي بعض So'ers المشرق سبحان الله الخفيف.

فقط استخدم وظائف DOM المضمنة. يتم كتابتها في C وجزء من Core PHP. فهي أسرع أكثر كفاءة من أي حل طرف ثالث. مع Firebug ، الحصول على استعلام Xpath هو muey بسيط. لقد جعل هذا التغيير البسيط الكاشطات المستندة إلى PHP تعمل بشكل أسرع ، مع توفير وقتي الثمين.

اعتادت الكاشطات الخاصة بي أن تأخذ حوالي 60 ميغابايت لكشط 10 مواقع بشكل غير متزامن مع حليقة. كان ذلك حتى مع إصلاح ذاكرة HTML DOM البسيطة التي ذكرتها.

الآن عمليات PHP الخاصة بي لا تتجاوز 8 ميغابايت.

ينصح به بشده.

تعديل

حسنًا ، لقد فعلت بعض المعايير. بنيت في DOM على الأقل ترتيب من حيث الحجم أسرع.

Built in php DOM: 0.007061
Simple html  DOM: 0.117781

<?
include("../lib/simple_html_dom.php");

$html = file_get_contents("http://stackoverflow.com/search?q=favorite+programmer+cartoon");
$data['dom'] = $data['simple_dom'] = array();

$timer_start = microtime(true);

$dom = new DOMDocument();
@$dom->loadHTML($html);
$x = new DOMXPath($dom); 

foreach($x->query("//a") as $node) 
{
     $data['dom'][] = $node->getAttribute("href");
}

foreach($x->query("//img") as $node) 
{
     $data['dom'][] = $node->getAttribute("src");
}

foreach($x->query("//input") as $node) 
{
     $data['dom'][] = $node->getAttribute("name");
}

$dom_time =  microtime(true) - $timer_start;

echo "built in php DOM : $dom_time\n";

$timer_start = microtime(true);
$simple_dom = new simple_html_dom();
$simple_dom->load($html);
foreach( $simple_dom->find("a") as $node)
{
   $data['simple_dom'][] = $node->href;
}

foreach( $simple_dom->find("img") as $node)
{
   $data['simple_dom'][] = $node->src;
}

foreach( $simple_dom->find("input") as $node)
{
   $data['simple_dom'][] = $node->name;
}
$simple_dom_time =  microtime(true) - $timer_start;

echo "simple html  DOM : $simple_dom_time\n";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top