2010-08-30 82 views
11

những ưu điểm và nhược điểm của các thư viện sau là gì?các truy vấn cào và css html

Từ QP trên tôi đã sử dụng và nó thất bại trong việc phân tích cú pháp HTML không hợp lệ, và simpleDomParser, mà làm một công việc tốt, nhưng nó kinda rò rỉ bộ nhớ vì mô hình đối tượng. Nhưng bạn có thể giữ điều đó dưới sự kiểm soát bằng cách gọi $object->clear(); unset($object); khi bạn không cần một đối tượng nữa.

Có cào giấy nào khác không? Kinh nghiệm của bạn với họ là gì? Tôi sẽ biến nó thành một wiki cộng đồng, chúng ta có thể xây dựng một danh sách các thư viện hữu ích có thể hữu ích khi cạo.


tôi đã làm một số xét nghiệm dựa Byron của câu trả lời:

<? 
    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>"; 

và có

dom:   0.00359296798706 . Got 115 items 
PQ:   0.010568857193 . Got 115 items 
simple_dom: 0.0770139694214 . Got 115 items 

Trả lời

7

tôi sử dụng để sử dụng dom html đơn giản dành riêng cho đến khi một số SO'ers sáng chỉ cho tôi những bài hát ca ngợi ánh sáng .

Chỉ cần sử dụng các hàm DOM được tích hợp sẵn. Chúng được viết bằng C và một phần của lõi PHP. Chúng nhanh hơn hiệu quả hơn bất kỳ giải pháp của bên thứ ba nào. Với firebug, nhận được một truy vấn XPath là muey đơn giản. Sự thay đổi đơn giản này đã khiến cho các trình gỡ bỏ dựa trên php của tôi chạy nhanh hơn, đồng thời tiết kiệm thời gian quý báu của tôi.

Máy chọc của tôi đã sử dụng ~ 60 megabyte để quét 10 trang web một cách đồng bộ với curl. Đó là ngay cả với bộ nhớ dom html đơn giản sửa chữa bạn đã đề cập.

Bây giờ các quy trình php của tôi không bao giờ vượt quá 8 megabyte.

Rất khuyến khích.

EDIT

Được rồi tôi đã làm một số điểm chuẩn. Được xây dựng trong dom ít nhất là một thứ tự cường độ nhanh hơn.

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

điều này không hoạt động đối với đánh dấu không hợp lệ. Làm thế nào nhanh hơn này là so với dom đơn giản? – Quamis

+2

Điều này ** không ** làm việc để đánh dấu không hợp lệ. Tôi không có điểm chuẩn nhưng nó ít nhất là một thứ tự cường độ nhanh hơn. Trên các trang lớn, đơn giản html dom sẽ mất 1-2 giây. Việc xây dựng trong DOM hiện nó trong chớp mắt. Tôi đã viết nhiều scrapers với điều này và tôi sẽ không bao giờ sử dụng dom html đơn giản cho bất cứ điều gì bao giờ trở lại. –

+0

@Quamis Lưu ý @ ở phía trước loadHtml(). Với việc gỡ bỏ đó, bạn sẽ thấy một tấn cảnh báo từ html không hợp lệ bị ép buộc vào cây dom. Làm việc cho các trình duyệt, làm việc cho php quá;) –

Các vấn đề liên quan