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
đ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
Đ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. –
@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á;) –