2010-08-30 21 views
11

निम्नलिखित पुस्तकालयों के फायदे और नुकसान क्या हैं?एचटीएमएल स्क्रैपिंग और सीएसएस प्रश्न

ऊपर मैं का उपयोग किया है 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 

उत्तर

7

मैं जब तक कुछ चमकीले SO'ers मुझे प्रकाश हलिलुय से पता चला है विशेष रूप से सरल एचटीएमएल डोम का उपयोग करते थे ।

बस निर्मित डीओएम कार्यों का उपयोग करें। वे सी और PHP कोर के हिस्से में लिखे गए हैं। वे किसी भी तृतीय पक्ष समाधान की तुलना में तेज़ी से अधिक कुशल हैं। फायरबग के साथ, एक XPath क्वेरी प्राप्त करना आसान है। इस सरल परिवर्तन ने मेरे बहुमूल्य समय को बचाने के दौरान, मेरे PHP आधारित स्क्रैपर्स को तेजी से चलाया है।

मेरे स्क्रैपर्स ~ 60 मेगाबाइट्स को कर्क के साथ असीमित रूप से 10 साइटों को स्क्रैप करने के लिए इस्तेमाल करते थे। यह आपके द्वारा उल्लिखित सरल HTML डोम मेमोरी फिक्स के साथ भी था।

अब मेरी PHP प्रक्रियाएं 8 मेगाबाइट से ऊपर कभी नहीं जातीं।

अत्यधिक अनुशंसित।

संपादित

ठीक है, मैं कुछ मानक था। डोम में निर्मित कम से कम तीव्रता का क्रम है।

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"; 
+0

यह अवैध मार्कअप के लिए काम नहीं करेगा। यह बनाम सरल डोम कितना तेज़ है? – Quamis

+2

यह ** ** अवैध मार्कअप के लिए काम करता है। मेरे पास बेंचमार्क नहीं हैं लेकिन यह कम से कम तीव्रता का क्रम है। बड़े पृष्ठों पर, साधारण एचटीएमएल डोम में 1-2 सेकंड लगेंगे। डीओएम में निर्मित यह आंखों के झपकी में करता है। मैंने इसके साथ कई स्क्रैपर्स लिखे हैं और मैं कभी भी कुछ भी नहीं के लिए सरल एचटीएमएल डोम का उपयोग नहीं करूंगा। –

+0

@Quamis लोड एचटीएमएल() के सामने @ नोटिस। उस हटाए जाने के साथ आप अमान्य एचटीएमएल से डोम पेड़ में घुसने से चेतावनी का एक टन देखेंगे। ब्राउज़र के लिए काम करता है, php के लिए भी काम करता है;) –

संबंधित मुद्दे