Cách code để lấy thông tin từ các trang web. (P2)

Tôi Có Thể Viết
Thiết Kế Cuộc Sống
3 min readNov 16, 2017

Các bạn có thể theo dõi P1 tại đây.

Nguồn: https://www.123rf.com/photo_46527751_stock-vector-hey-you-can-do-it-motivational-lettering-quote.html

Giờ chúng ta sẽ cố gắng giải quyết việc nâng cao hơn, lấy dữ liệu từ 56 trang khác nhau, chứ không phải chỉ lấy trên một trang như xưa nữa.

Mở một trang bất kỳ lên ta có thể thấy đường dẫn như thế này:

http://www.cophieu68.vn/companylist.php?currentPage=3&o=s&ud=a

Để ý thấy giá trị “currentPage=3” với 3 chính là số thứ tự trang đang mở. Vậy là ta có thể tự động mở hết các trang với tham số trên đường dẫn được rồi.

Ý tưởng ở đây là, chúng ta vũng vẫn dùng Java script chạy trên Chrome thôi, dùng kỹ thuật AJAX lần lượt tải từng trang về. Rồi dùng jQuery để đọc trang đó rồi cũng trích xuất ra danh sách các mã như ở phần 1 đã giới thiệu.

function loadPage(index) {var currentUrl = 'http://www.cophieu68.vn/companylist.php?o=s&ud=a&currentPage=' + index;var currentId = index;$.ajax({url: currentUrl,success: onResult});function onResult(result) {console.log('The Result index: ' + currentId);var doc = $(result);var stockArrDom = doc.find('table tbody tr td:nth-child(2) a strong');console.log(stockArrDom.length);//Iterate all td's in second columnstockArrDom.each(function () {//add item to arrayresultArray.push($(this).text());});}}

Viết function cho dễ gọi ấy mà.

Điều kỳ diệu ở đây chính là chúng ta dùng jQuery để đọc dữ liệu trả về từ AJAX. Rất nhanh gọn.

var doc = $(result);var stockArrDom = doc.find('table tbody tr td:nth-child(2) a strong');

Giờ để chạy hết 56 trang rất đơn giản thôi, làm ra vòng lặp 56 lần, lần lượt gọi hàm loadPage(pageNumber) là chạy thôi.

Khi mình dùng vòng lặp For thì có gặp vấn đề nho nhỏ, là nó request hết 56 AJAX request đó một lần luôn nên dẫn đến nghẽn mạng và RAM vì chiếm dụng nhiều. Số lượng trang này ít thì chưa sao nhưng nếu số lượng này lớn lên thì có thể dẫn đến đứng máy vì tràn RAM hoặc trình duyệt vì crash. Có cách để làm cho các request này chạy tuần tự, nhưng mình làm biếng, mình chọn cách đơn giản hơn là dùng vòng lặp có delay, không gọi hết 56 request một lần mà để khoảng 1 giây mới gọi một lần.

var timeInterval;timeInterval = setInterval(function () {console.log("Run into Interval");if (superIndex <= PAGE_END) {// Call to load page.loadPage(superIndex);// Next pagesuperIndex = superIndex + 1;} else {clearInterval(timeInterval);}}, 1000);

Sau khi chạy xong ta đã có mảng danh sách tất cả các mã chứng khoán. Nhưng làm sao để tải nó. Mình sẽ biến dữ liệu đó thành file JSON và lưu file lại bằng một request download.

uriContent = "data:application/octet-stream," + encodeURIComponent(JSON.stringify(resultArray));newWindow = window.open(uriContent, 'neuesDokument');

Vậy là lưu file JSON xong ngon lành. Dữ liệu ở trong máy của bạn rồi, bạn có thể làm bất cứ điều gì bạn muốn với chúng.

Code đầy đủ đây nha:

Chúc mọi người có thể tận dụng được cách thức này để tiết kiệm thời gian trong tương lai.

YOLO!

--

--

Tôi Có Thể Viết
Thiết Kế Cuộc Sống

Những bài viết ngắn mỗi ngày về những điều quan trọng trong cuộc sống