PHP AJAX
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
Dự án mới của mình là gamehow.net, mời anh em ghé thăm và góp ý ạ.

Hướng dẫn crawl dữ liệu trang chonbaihat bằng Ajax + PHP

Chào các bạn, lâu rồi không viết tut về Ajax nên hôm nay mình viết bài này để hướng dẫn các bạn cách sử dụng Javascript kết hợp với PHP để lấy dữ liệu của trang chonbaihat.com.

1. Ý tưởng bóc tách dữ liệu trang chonbaihat

Trước khi crawl một trang web bất kì thì bạn phải soi toàn bộ cấu trúc HTML để đưa ra một phương án giải quyết, điều này có nghĩa mỗi trang bạn sẽ phải code khác nhau vì cấu trúc của nó khác nhau.

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Như trang chonbaihat mình thấy toàn bộ dữ liệu của nó được phân theo ký tự A, B, C, D, E, .... Y. Như vậy mình cũng sẽ viết thuật toán duyệt qua từng ký tự và mỗi ký tự sẽ có danh sách các trang con.

Ví dụ:

  • http://chonbaihat.com/bat-dau-bang/A/trang/1
  • http://chonbaihat.com/bat-dau-bang/A/trang/2
  • ...

Để biết khi nào kết thúc ký tự A để sang ký tự B thì mình nhận thấy điều sau: Khi load một trang có số page không tồn tại thì nó sẽ trả về không có bài hát nào, đây chính là đặc điểm để qua ký tự mới.

Mình sử dụng CSS selector kết hợp jQuery Selector để bóc nội dung của từng bài hát.

2. Code bóc tách dữ liệu trang chonbaihat

Về code sẽ hơi khó giải thích nên mình sẽ không nói nhiều, bạn hãy tự làm theo từng bước thôi nhé, ai soi code được thì soi :)

Trước tiên bạn tạo 3 trang như sau:

  • index.php: Đây là trang chính xử lý bóc tách dữ liệu
  • getpage.php: Do JS không thể lấy content của một trang web online được nên trang này sẽ có nhiệm vụ trả về mã HTML của một trang web
  • save.php: Là trang lưu bài hát vào CSDL, trang này mình sẽ không code mà bạn sẽ phải tự code nhé.
getpage.php
<?php echo file_get_contents($_GET['url']);

File getpage.php chỉ có đoạn code trả về nội dung của một trang web dựa vào tham số url.

save.php
<pre><?php
var_dump($_POST);

File save.php mình chỉ in ra các giá trị của biến POST, bạn hãy dựa vào các giá trị này mà lưu vào CSDL nhé. Nếu chưa biết cách lưu thì hãy đọc series PHP và MySQL.

index.php
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
    </head>
    <body>
        <div id="mess">
            
        </div>
        
        <script>
            
            function showMess(mess){
                $('#mess').append("<p>" + mess + "</p>");
            }
            
            // Danh sách trang cần lấy
            var listChar = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"];
            
            // Vị trí hiện tại của trang ký tự
            var currentChar = 0;

            // Trang hiện tại cần lấy
            var currentPage = 1;

            // Lưu tất cả các bài hát của 1 trang
            var allItem = [];

            function startAPage()
            {
                if (currentPage == 0){
                    currentPage = 1;
                    currentChar++;
                }
                allItem = [];
                savePageIndex = 0;
                $.ajax({
                    url : "/getpage.php",
                    data : {
                        url : "http://chonbaihat.com/bat-dau-bang/" + listChar[currentChar] + '/trang/' + currentPage
                    },
                    type : "get",
                    dataType:"text",
                    success : function(result){
                        showMess("<span style='color: red'>Tải trang: http://chonbaihat.com/bat-dau-bang/" + listChar[currentChar] + '/trang/' + currentPage + "</span>");
                        
                        var html = $.parseHTML(result);
                        var items = $(html).find(".list-song .song");

                        for (var i = 0; i < items.length; i++)
                        {
                            var html = $.parseHTML(result);
                            var item = $(items[i]).find(".name a").attr('href');
                            allItem.push(item);
                        }
                        
                        // Bắt đầu duyệt lưu từng bài hát
                        if (allItem.length > 0){
                            savePage();
                        }
                        else {
                            showMess('<span style="color: blue">Hết, qua ký tự mới!</span>"');
                            if (currentChar == listChar.length - 1){
                                showMess("Kết thúc!");
                            }
                            else {
                                currentPage = 0;
                                startAPage();
                            }
                            
                        }
                    }
                });
            }

            startAPage();

            var savePageIndex = 0;
            function savePage()
            {
                var url = allItem[savePageIndex];
                $.ajax({
                    url : "/getpage.php",
                    data : {
                        url : url
                    },
                    type : "get",
                    dataType:"text",
                    success : function(result)
                    {
                        var html = $.parseHTML(result);

                        var data = {
                            title : $(html).find('.song.detail .name').text(),
                            maso : $(html).find('.song.detail .number').text(),
                            composer : $(html).find('.song.detail .artist a').text(),
                            content : $(html).find('.song.detail .lyric').html()
                        };

                        $.ajax({
                            url : "/save.php",
                            data : data,
                            type : "post",
                            dataType:"text",
                            success : function(result){
                                showMess('<span style="color: blue">Lưu thành công bài hát ' + data.title + "</span>");
                                // Qua bài tiếp theo
                                savePageIndex++;
                                if (savePageIndex < allItem.length - 1){
                                    savePage();
                                }
                                else {
                                    currentPage++;
                                    startAPage();
                                }
                            }
                        });
                    }
                });
            }

        </script>
    </body>
</html>

Bạn sẽ chạy file index.php thì kết quả như sau:

craw chon bai hat PNG

3. Lời kết

Bài này mình chỉ đăng code chính lên thôi nhé, còn thiếu phần sử dụng PHP để lưu vào CSDL, mình nghĩ nó quá đơn giản đối với bạn.  Các bạn có thể tải source code về để tham khảo nhé.

Bạn muốn mua full code của bộ source này?

Chỉ với 200k là bạn có thể nhận full code có thêm phần lưu vào CSDL, liên hệ thehalfheart nhé.

Tổng hợp dữ liệu trong bài:

Cùng chuyên mục:

Hàm key_exists() trong PHP

Hàm key_exists() trong PHP

Cách sử dụng key_exists() trong PHP

Hàm mysqli_fetch_row() trong PHP

Hàm mysqli_fetch_row() trong PHP

Cách sử dụng mysqli_fetch_row() trong PHP

Hàm end() trong PHP

Hàm end() trong PHP

Cách sử dụng end() trong PHP

Hàm mysqli_field_count() trong PHP

Hàm mysqli_field_count() trong PHP

Cách sử dụng mysqli_field_count() trong PHP

Hàm count() trong PHP

Hàm count() trong PHP

Cách sử dụng count() trong PHP

Hàm mysqli_field_seek() trong PHP

Hàm mysqli_field_seek() trong PHP

Cách sử dụng mysqli_field_seek() trong PHP

Hàm compact() trong PHP

Hàm compact() trong PHP

Cách sử dụng compact() trong PHP

Hàm mysqli_field_tell() trong PHP

Hàm mysqli_field_tell() trong PHP

Cách sử dụng mysqli_field_tell() trong PHP

Hàm array_values() trong PHP

Hàm array_values() trong PHP

Cách sử dụng array_values() trong PHP

Hàm mysqli_free_result() trong PHP

Hàm mysqli_free_result() trong PHP

Cách sử dụng mysqli_free_result() trong PHP

Hàm array_unshift() trong PHP

Hàm array_unshift() trong PHP

Cách sử dụng array_unshift() trong PHP

Hàm mysqli_get_charset() trong PHP

Hàm mysqli_get_charset() trong PHP

Cách sử dụng mysqli_get_charset() trong PHP

Hàm array_shift() trong PHP

Hàm array_shift() trong PHP

Cách sử dụng array_shift() trong PHP

Hàm mysqli_get_client_stats() trong PHP

Hàm mysqli_get_client_stats() trong PHP

Cách sử dụng mysqli_get_client_stats() trong PHP

Hàm array_unique() trong PHP

Hàm array_unique() trong PHP

Cách sử dụng array_unique() trong PHP

Hàm mysqli_get_client_version() trong PHP

Hàm mysqli_get_client_version() trong PHP

Cách sử dụng mysqli_get_client_version() trong PHP

Hàm array_uintesect() trong PHP

Hàm array_uintesect() trong PHP

Cách sử dụng array_uintesect() trong PHP

Hàm mysqli_get_connection_stats() trong PHP

Hàm mysqli_get_connection_stats() trong PHP

Cách sử dụng mysqli_get_connection_stats() trong PHP

Hàm array_sum() trong PHP

Hàm array_sum() trong PHP

Cách sử dụng array_sum() trong PHP

Hàm mysqli_get_host_info() trong PHP

Hàm mysqli_get_host_info() trong PHP

Cách sử dụng mysqli_get_host_info() trong PHP

Top