Cách code để lấy thông tin từ các trang web.
Vừa rồi mình có việc cần tổng hợp thông tin các mã chứng khoán. Thấy tổng cộng 1360 mã mà ngồi làm thủ công chắc đuối. Vậy là ngồi mày mò viết code Javascript chạy trên trình duyệt Chrome để tự lấy dữ liệu, tổng hợp lại thành file Excel.
Hồi xưa mình cứ nghĩ cào dữ liệu (cách dân gian gọi việc tự động đọc thông tin và dữ liệu từ các website) phức tạp lắm, nhưng hóa ra, với nhu cầu đơn giản thì công việc cần làm cũng không khó lắm.
Phân tích bài toán
Tất nhiên rồi, trước khi làm cái gì cũng phải hiểu mục đích là gì và xác định các vấn đề cần giải quyết.
Ví dụ lúc này mình cần lấy danh sách tất cả mã chứng khoán, lập lại thành một danh sách, dạng JSON cũng được.
Lên trang http://www.cophieu68.vn/companylist.php và Inspect Element để hiểu cấu trúc của nó. Như hình bên dưới thể hiện, mình cần đọc nội dung bên trong tag <strong>, nằm trong các dòng <tr> của một bảng <table>. Không quá khó phải không nào.
Bắt tay code thử
Mình biết rằng Chrome có thể chạy mã Javascript được, và để đọc file HTML thì cách dễ nhất là dùng jQuery.
Mày mò thì mình cũng code được cái mã này, dùng jQuery:
Đoạn này để thêm jQuery vào trang nếu trang này chưa có sẵn.
// Add this code to load JQuery first(function () { // Load the script var script = document.createElement("SCRIPT"); script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'; script.type = 'text/javascript'; script.onload = function () { var $ = window.jQuery; // Use $ here... }; document.getElementsByTagName("head")[0].appendChild(script);})();
Sau đó là chạy được đoạn code này rồi:
var items=[];//Iterate all td's in second column$('table tbody tr td:nth-child(2) a strong').each( function(){ //add item to array items.push( $(this).text() );});JSON.stringify(items);
Phần này dung jQuery selector để chọn tất cả những tag mình cần, rồi lần lượt đọc từng cái một rồi thêm vào mảng “items”. Cuối cùng là in ra dạng JSON, để mình copy thả vào tài liệu của mình thôi.
Nâng cao hơn nữa.
Nhưng mà, một trang này chỉ có 25 mã thôi, tức là mình sẽ phải đọc nhiều trang. Cách trên chỉ có thể đọc trên từng trang hiện hành. Có 56 trang tất cả và nếu mình làm như cách trên thì sẽ phải lặp đi lặp lại đến 56 lần. Không vui :)
Bài viết hôm sau mình sẽ chia sẻ chi tiết cách làm nâng cao hơn nha. Các bạn có ý tưởng giải pháp nào xin thoải mái đóng góp nhé, mình rất mong được học hỏi từ mọi người.
YOLO!