Giải pháp hiệu quả tăng Traffic cho website
Traffic Exchange Site

Code crawl nội dung từ một website tin tức bất kỳ

By
( Khởi nghiệp với Internet)
Hôm nay mình sẽ share cho các bạn đoạn code mình viết dùng để bóc tách nội dung từ một website bất kỳ. Các bạn có thể download class  tại đây. Sau khi tải về các bạn giải nén ra sẽ có 2 file
simple_html_dom.php: đây là file thư viện html_dom file này không phải do mình viết mà download từ trên mạng về. Dùng để truy cập các phần tử dom một cách rất dễ dàng. Và mình sẽ không giải thích về class này, các bạn có thể search simple html dom sẽ có rất nhiều ví dụ và hướng dẫn
crawl.class.php: File chứa class, trong đó có các functions mình viết phục vụ cho việc bóc tách nội dung
Nội dung file crawl.class.php  như sau

  1. <?php
  2.  
  3. include_once("simple_html_dom.php");
  4.  
  5. class H_Crawl{
  6.  
  7.     var $html_content = '';
  8.     var $arr_att_clean = array();
  9.  
  10.     function H_Crawl(){
  11.         // nothing to do
  12.     }
  13.  
  14.     // function lay title cua bai viet
  15.     function getTitle($link, $att_title){
  16.         if($this->html_content==''){
  17.             $html = file_get_html($link);
  18.             $this->html_content = $html;
  19.         }else{
  20.             $html = $this->html_content;
  21.         }
  22.  
  23.         foreach($html->find($att_title) as $e){
  24.             $title = $e->innertext;
  25.         }
  26.         return $title;
  27.     }
  28.  
  29.     // function lay noi dung cua mot bai viet
  30.     function  getContent($link, $att_content){
  31.         if($this->html_content==''){
  32.             $html = file_get_html($link);
  33.             $this->html_content = $html;
  34.         }else{
  35.             $html = $this->html_content;
  36.         }
  37.  
  38.         foreach($html->find($att_content) as $e){
  39.             $content_html = $e->innertext;
  40.         }
  41.         $html = str_get_html($content_html);
  42.  
  43.         foreach($this->arr_att_clean as $att_clean){
  44.             // google+
  45.             foreach($html->find($att_clean) as $e){
  46.                 $e->outertext = '';
  47.             }
  48.         }
  49.  
  50.         $ret = $html->save();
  51.         return $ret;
  52.     }
  53.  
  54.     // function remove het cac lien ket trong mot chuoi html truyen vao
  55.     function removeLink($content){
  56.         $html = str_get_html($content);
  57.         // link content
  58.         foreach($html->find('a') as $e){
  59.             $e->outertext = $e->innertext;
  60.         }
  61.         $ret = $html->save();
  62.         return $ret;
  63.     }
  64.  
  65.     // function xoa phan tu html cuoi cung
  66.     function removeLastElement($content, $element){
  67.         $html = str_get_html($content);
  68.         // link content
  69.         $html->find($element, -1)->outertext = '';
  70.         $ret = $html->save();
  71.         return $ret;
  72.     }
  73.  
  74.     // function xoa phan tu html truyen vao dau tien
  75.     function removeFirstElement($content, $element){
  76.         $html = str_get_html($content);
  77.         $html->find($element, 0)->outertext = '';
  78.         $ret = $html->save();
  79.         return $ret;
  80.     }
  81.  
  82. }

Xin giải thích một chút về class trên:
Dòng 7,8 là hai biến của class
1
2
var $html_content = '';
var $arr_att_clean = array();
Dòng 15: function có tác dụng lấy title của một bài viết. Có 2 tham số truyền vào là:
$link: truyền vào là url của một bài viết
$element:
element chứa title.
Ví dụ bài viết http://thethao.vnexpress.net/tin-tuc/sea-games-27/tuyen-nu-viet-nam-thang-tung-bung-ngay-ra-quan-2923453.html có title là Tuyển nữ Việt Nam thắng tưng bừng ngày ra quân
Code crawl nội dung từ một website
Sau khi dùng firebug để xem thì biết được rằng element truyền vào sẽ là “div.title_news h1″.
Vậy tham số truyền vào là
$url = “http://thethao.vnexpress.net/tin-tuc/sea-games-27/tuyen-nu-viet-nam-thang-tung-bung-ngay-ra-quan-2923453.html&#8221;
$element = “div.title_news h1″
Làm tương tự như vậy với hàm lấy content (nội dung) ta sẽ có
$url: tương tự như trên
$element =  “div.fck_detail”
Sau đây là ví dụ cụ thể về lấy title và content của một bài viết, cụ thể là bài viết trên
  1. <head>
  2.     <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  3.     <meta name="author" content="duchanh" />
  4.     <title>Crawl</title>
  5. </head>
  6. <?php
  7.  
  8. include_once('crawl.class.php');
  9.  
  10. $link = 'http://thethao.vnexpress.net/tin-tuc/sea-games-27/tuyen-nu-viet-nam-thang-tung-bung-ngay-ra-quan-2923453.html';
  11.  
  12. $H_Crawl = new H_Crawl();
  13. // xoa het cac the javascript va nhung the co class=".thumblock" di
  14. $H_Crawl->arr_att_clean  = array('script','.thumblock');
  15.  
  16. // lay title bai viet
  17. $title = $H_Crawl->getTitle($link, 'div.title_news h1');
  18.  
  19. // lay noi dung bai viet
  20. $content = $H_Crawl->getTitle($link, 'div.fck_detail');
  21.  
  22. // xoa het cac link trong phan noi dung di
  23. $content = $H_Crawl->removeLink($content);
  24.  
  25. var_dump($title);
  26. var_dump($content);
  27. ?>

Rất ngắn gọn phải không? với class này các bạn có thể crawl nội dung của một trang web bất kỳ chỉ cần biết được các element cần bóc tách.
Ví dụ trên là lấy tin tức từ site vnexpress nội dung khá là clear. Với những site khác thì nội dung lấy về có thể chứa những thẻ mình không mong muốn như metag, like facebook ở những thì những function còn lại trong class mình viết sẽ phát huy tác dụng.

Chúc các bạn thành công

Blog tổng hợp những kinh nghiệm được học, áp dụng và chia sẻ


Loading...