निम्नलिखित पुस्तकालयों के फायदे और नुकसान क्या हैं?एचटीएमएल स्क्रैपिंग और सीएसएस प्रश्न
ऊपर मैं का उपयोग किया है 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
यह अवैध मार्कअप के लिए काम नहीं करेगा। यह बनाम सरल डोम कितना तेज़ है? – Quamis
यह ** ** अवैध मार्कअप के लिए काम करता है। मेरे पास बेंचमार्क नहीं हैं लेकिन यह कम से कम तीव्रता का क्रम है। बड़े पृष्ठों पर, साधारण एचटीएमएल डोम में 1-2 सेकंड लगेंगे। डीओएम में निर्मित यह आंखों के झपकी में करता है। मैंने इसके साथ कई स्क्रैपर्स लिखे हैं और मैं कभी भी कुछ भी नहीं के लिए सरल एचटीएमएल डोम का उपयोग नहीं करूंगा। –
@Quamis लोड एचटीएमएल() के सामने @ नोटिस। उस हटाए जाने के साथ आप अमान्य एचटीएमएल से डोम पेड़ में घुसने से चेतावनी का एक टन देखेंगे। ब्राउज़र के लिए काम करता है, php के लिए भी काम करता है;) –