Hướng dẫn wordpress domdocument - wordpress domdocument
Trong lĩnh vực lập trình web, thuật ngữ Crawler Data đã không còn xa lạ. Tuy nhiên, để làm việc được với nó đòi hỏi bạn cần có kiến thức về lập trình.Crawler Data đã không còn xa lạ. Tuy nhiên, để làm việc được với nó đòi hỏi bạn cần có kiến thức về lập trình. Show Vậy Crawler Data là gì? Làm sao để Crawler Data trong WordPress? Bài viết này tôi sẽ chia sẻ chi tiết về vấn đề này. Crawler Data là gì?Crawler Data chính là thu thập dữ liệu từ một trang web bất kì, hoặc chỉ định trước rồi phân tích cú pháp mã nguồn HTML để đọc dữ liệu và bóc tách thông tin dữ liệu theo yêu cầu mà người dùng đặt ra. chính là thu thập dữ liệu từ một trang web bất kì, hoặc chỉ định trước rồi phân tích cú pháp mã nguồn HTML để đọc dữ liệu và bóc tách thông tin dữ liệu theo yêu cầu mà người dùng đặt ra. Crawler Data bằng những cách nào?Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào để Crawler Data. Mỗi ngôn ngữ sẽ có ưu điểm và nhược điểm riêng. Bài viết này tôi đề cập đến WordPress nên tôi sẽ sử dụng PHP để thực hiện công việc Crawler. Với ngôn ngữ lập trình PHP, có những cách sau:
Việc bóc tách bằng Regular Expression (Biểu thức chính quy) khá phức tạp cho bạn nào chưa có kinh nghiệm viết biểu thức chính quy.Regular Expression (Biểu thức chính quy) khá phức tạp cho bạn nào chưa có kinh nghiệm viết biểu thức chính quy. Crawler Data có cần sử dụng phần mềm không?Nếu nội dung được Render bằng Ajax thì bạn phải tìm được Request Ajax (Sử dụng tab Network của Chrome), sau đó test Request đó bằng phần mềm Postman để xem Request đó có trả về nội dung cần lấy không? Vậy bạn cần chuẩn bị phần mềm Postman để thực hiện công việc này: https://www.postman.comhttps://www.postman.com Hướng dẫn sử dụng SIMPLE HTML DOMSimple HTML Dom là một thư viện chuyên được sử dụng để bóc tách dữ liệu. Trang chủ thư viện: https://simplehtmldom.sourceforge.io là một thư viện chuyên được sử dụng để bóc tách dữ liệu. Trang chủ thư viện: https://simplehtmldom.sourceforge.io Các bước thực hiện: Bước 01: Tải thư viện Simple HTML Dom và require vào dự án cần làm: Tải thư viện Simple HTML Dom và require vào dự án cần làm Download thư viện tại đây: https://sourceforge.net/projects/simplehtmldomhttps://sourceforge.net/projects/simplehtmldom Giải nén và require file $html_content = file_get_html('https://hoangan.net/wordpress');6 vào project cần làm thông qua hàm $html_content = file_get_html('https://hoangan.net/wordpress');7
Bước 03: Viết code bóc tách dữ liệu Trước tiên, bạn hãy dùng ham $html_content = file_get_html('https://hoangan.net/wordpress');8 để đọc nội dung trang cần lấy. Giả sử tôi cần lấy tiêu đề, nội dung, link ảnh các bài viết trong chuyên mục WordPress trên website hoangan.net. Tôi sẽ viết như sau: $html_content = file_get_html('https://hoangan.net/wordpress'); Tiếp theo, bạn thử $html_content = file_get_html('https://hoangan.net/wordpress');9 biến $list_post = $html_content->find('.list_entry .cm-col-lg-6');0 xem có hiện nội dung chuyên mục của web gốc ra không? Nếu có hiện là bạn đã thành công bước đầu. Tiếp theo, bạn cần phân tích thành phần HTML cần lấy. Trong trường hợp này tôi cần lấy ra link của tất cả bài viết chuyên mục, sau đó tôi sẽ đọc từng bài và lấy ra tiêu đề, nội dung. Còn ảnh đại diện tôi sẽ lấy ở trang chuyên mục (Vì trong trang chi tiết không có ảnh đại diện)tiêu đề, nội dung. Còn ảnh đại diện tôi sẽ lấy ở trang chuyên mục (Vì trong trang chi tiết không có ảnh đại diện) Như vậy, tôi cần phải tìm được thành phần HTML lặp trong trang chuyên mục. Nhìn vào hình bạn sẽ thấy thẻ $list_post = $html_content->find('.list_entry .cm-col-lg-6');1 đang lặp bao quanh từng bài viết. Như vậy ta sẽ viết code như sau: $list_post = $html_content->find('.list_entry .cm-col-lg-6'); Bạn sẽ thấy nó giống như Selector trong CSS. Tôi phải đưa $list_post = $html_content->find('.list_entry .cm-col-lg-6');2 vào vì có thể trong trang sẽ có nhiều chỗ dùng $list_post = $html_content->find('.list_entry .cm-col-lg-6');3 Bây giờ, bạn sử dụng vòng lặp để đọc từng bài viết, sau đó ta lại bóc tách từng bài. if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } } Phân tích từng bài viết, bạn sẽ thấy link từng bài viết sẽ nằm trong cặp thẻ $list_post = $html_content->find('.list_entry .cm-col-lg-6');4. Việc bây giờ tôi sẽ phải lấy nội dung của thuộc tính $list_post = $html_content->find('.list_entry .cm-col-lg-6');5 Code như sau: if (!empty($list_post)){ foreach ($list_post as $post){ $post_link = $post->find('.post_title h2 a', 0)->href; } } Bạn thấy phương thức $list_post = $html_content->find('.list_entry .cm-col-lg-6');6 có 2 tham số:
Các thuộc tính của phương thức $list_post = $html_content->find('.list_entry .cm-col-lg-6');7:
Tiếp theo, tôi sẽ lấy link ảnh đại diện Đến đây, bạn đã biết cách lấy rồi đúng không? Tham khảo code của tôi nhé if (!empty($list_post)){ foreach ($list_post as $post){ $post_link = $post->find('.post_title h2 a', 0)->href; $thumb = $post->find('.post_thumb img')->src; } } Tiếp theo, tôi sẽ lấy tiêu đề, nội dung trong trang chi tiết bài viết. Code như sau: if (!empty($list_post)){ foreach ($list_post as $post){ $post_link = $post->find('.post_title h2 a', 0)->href; $thumb = $post->find('.post_thumb img')->src; //Post Detail $html_detail = file_get_html($post_link); $title = $html_detail->find('.content-entry .the_title h2', 0)->plaintext; $content = $html_detail->find('.content-entry .the_content', 0)->innertext; } } Như vậy tôi đã lấy được đủ thông tin rồi. Nếu bạn muốn xử lý dữ liệu hãy dùng biểu thức chính quy để xử lý. Giờ làm gì với dữ liệu này là việc của bạn. Crawler Data trong WordPress như thế nào?Bạn đã Crawler Data được bằng Simple HTML Dom, thì bạn chỉ cần đưa vào WordPress là được. Sau đây, tôi sẽ hướng dẫn bạn áp dụng với WordPress.Crawler Data được bằng Simple HTML Dom, thì bạn chỉ cần đưa vào WordPress là được. Sau đây, tôi sẽ hướng dẫn bạn áp dụng với WordPress. Đầu tiên, bạn hãy sao chép file $html_content = file_get_html('https://hoangan.net/wordpress');6 vào thư mục theme bạn đang sử dụng. Mở file if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }2 và chèn đoạn code sau vào đầu file (Sau if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }3) require_once 'simple_html_dom.php'; Tiếp theo, tôi sẽ sử dụng hook if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }4 kết hợp với biến if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }5 để tạo link thực hiện crawler. Khi tôi load link đó sẽ thực viện crawler và chèn nội dung vào bài viết WordPress. function add_crawl_data(){ if (!is_admin() && isset($_GET['act']) && $_GET['act']=='crawl'){ //Code Crawler die(); } } add_action('init', 'add_crawl_data'); Như vậy, link chạy crawler sẽ có dạng như sau: if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }6 Tiếp theo, tôi đưa code crawler vào: function add_crawl_data(){ if (!is_admin() && isset($_GET['act']) && $_GET['act']=='crawl'){ //Code Crawler $html_content = file_get_html('https://hoangan.net/wordpress'); $list_post = $html_content->find('.list_entry .cm-col-lg-6'); if (!empty($list_post)){ foreach ($list_post as $post){ $post_link = $post->find('.post_title h2 a', 0)->href; $thumb = $post->find('.post_thumb img')->src; //Post Detail $html_detail = file_get_html($post_link); $title = $html_detail->find('.content-entry .the_title h2', 0)->plaintext; $content = $html_detail->find('.content-entry .the_content', 0)->innertext; } } die(); } } add_action('init', 'add_crawl_data'); Sau khi lấy được dữ liệu rồi, tôi tiến hành việc insert vào WordPress. Trước khi insert, tôi cần phải kiểm tra xem bài viết đó có tồn tại trong website chưa? Sử dụng hàm if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }7 bạn nhé. Nhưng để hàm này hoạt động, bạn cần chèn đoạn code sau trước khi gọi nó: $html_content = file_get_html('https://hoangan.net/wordpress');0 Tiếp theo, tôi sử dụng hàm if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }8 để chèn vào WordPress $html_content = file_get_html('https://hoangan.net/wordpress');1 Nếu biến if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }9 trả về số nguyên dương thì vài viết đã insert thành công. Tiếp theo, tôi sẽ thực hiện việc set chuyên mục cho bài viết vừa insert. Tôi sẽ sử dụng hàm if (!empty($list_post)){ foreach ($list_post as $post){ $post_link = $post->find('.post_title h2 a', 0)->href; } }0 $html_content = file_get_html('https://hoangan.net/wordpress');2 Trong đó có 3 tham số:
Tiếp theo, tôi cần set ảnh đại diện cho bài viết. Tuy nhiên, WordPress không cho phép sử dụng link ảnh ngoài để set ảnh đại diện. Tôi sẽ phải tải ảnh về thư viện của WordPress. Trước đây tôi có một bài hướng dẫn làm việc này. Mời bạn đọc qua bài viết Lấy Link Ảnh Ngoài Làm Thumbnail Cho WordPressLấy Link Ảnh Ngoài Làm Thumbnail Cho WordPress Trong bài đó, tôi đã chia sẻ sẵn một hàm. Bạn copy nội dung hàm đó bỏ vào file if (!empty($list_post)){ foreach ($list_post as $post){ //Bóc tách từng post } }2 $html_content = file_get_html('https://hoangan.net/wordpress');3 Tiếp theo, bạn thực hiện set thumbnail như sau: $html_content = file_get_html('https://hoangan.net/wordpress');4 Có vẻ ok rồi đây, giờ ghép code lại như sau: $html_content = file_get_html('https://hoangan.net/wordpress');5 Cuối cùng, bạn thử chạy link crawl để xem kết quả. Thời gian chạy có thể hơi lâu do số lượng bài viết trong chuyên mục. Nếu bị timeout, bạn tải lại nhé. Nếu bạn muốn lấy dữ liệu tự động, cứ có bài mới thì sẽ tự lấy về. Hãy đưa link chạy vào if (!empty($list_post)){ foreach ($list_post as $post){ $post_link = $post->find('.post_title h2 a', 0)->href; } }2. Nếu bạn muốn crawler các phân trang nữa thì bạn đưa đoạn code crawler đã làm ở trên vào một vòng lặp các trang. Đến đây tôi nghĩ bạn tự làm được rồi. Kết thúcTrên đây, tôi đã hướng dẫn cơ bản cho các bạn cách thức Crawler Data trong WordPress sử dụng thư viện Simple HTML DomCrawler Data trong WordPress sử dụng thư viện Simple HTML Dom Nó không khó, nhưng đòi hỏi bạn phải có kiến thức về lập trình. Bài sau, tôi sẽ viết về chủ đề Crawler nội dung Render bằng Ajax. Nếu có bất kỳ câu hỏi nào hãy comment dưới bài viết này. |