Xây dựng crawler siêu đơn giản với Java (Phần 3)

Tổng quan

1.3. Thực hành

Bây giờ, các bạn có thể tự thực hành với hướng dẫn hai bước trên để xác định những thông tin còn lại.

Nếu cần có kết quả ngay thì bạn có thể tham khảo mã nguồn mình cung cấp ở cuối bài viết này!

1.4. Tổng hợp các regex tìm được

Dưới đây các regex đã tìm được với trang batdongsan.com.vn để các bạn tham khảo:

  1. Link các danh mục tin
  2. Link đến nội dung chi tiết
  3. Thông tin cụ thể (như tiêu đề, giá, diện tích,…) trong tin chi tiết

1.4.1. Link các danh mục tin

Tìm các link bên trong mục “Nhà đất bán” và “Nhà đất cho thuê”:

Pattern p1 = Pattern.compile("<li class='lv0'><a href='/nha-dat-ban' class='haslink '>Nhà đất bán</a><ul>(.*?)</ul>");
Pattern p2 = Pattern.compile("<li class='lv0'><a href='/nha-dat-cho-thue' class='haslink '>Nhà đất cho thuê</a><ul>(.*?)</ul>");

Sau đó, tìm các link danh mục thuộc “Nhà đất bán” và “Nhà đất cho thuê” để loại các link không cần thiết:

Pattern pLink = Pattern.compile("<li class='lv1'><a href='(.*?)' class='haslink '>");

1.4.2. Link đến nội dung chi tiết

 Pattern p = Pattern.compile("<div class='p-title'><h3><a href='(.*?)' title");

1.4.3. Thông tin cụ thể trong tin chi tiết

<span id="48e5" class="ir gx ap ce in b ei is it r iu" data-selectable-paragraph="">String title = "<h1 itemprop=\\"name\\">(.*?)</h1>";
String price = "<span class=\\"gia-title mar-right-15\\"><b>Giá:</b><strong>(.*?)</strong>";</span><span id="e97c" class="ir gx ap ce in b ei iv iw ix iy iz it r iu" data-selectable-paragraph="">Pattern p = Pattern.compile(title + ".*" + price);</span>

2. Viết mã crawler cho từng trang web cụ thể

Xác định được các regex pattern để lấy những thông tin cần thiết ở trên là chúng ta đã đi được 50% chặng đường. Việc còn lại là kết hợp các regex trên để viết mã crawler cụ thể cho từng trang web theo thiết kế được trình bày trong mục Thiết kế tổng quan.

Các class dành cho trang cụ thể sẽ implement những phương thức abstract đã định nghĩa trong Crawler:

    // bước 1
    abstract Iterable<Subpage> inspectHomepage();
		
    // bước 2
    abstract Iterable<DetailPage> inspectSubpage(Subpage subpage);
		
    // bước 3
    abstract ClassifiedAd inspectDetailPage(DetailPage detailPage);

inspectHomepage() sẽ sử dụng các regex như minh hoạ trong mục Hướng dẫn bước 1.

inspectSubpage trả về danh sách link các trang chi tiết.

inspectDetailPage trả về thông tin cụ thể từ trang chi tiết.

Cải tiến

Như đã trình bày ở trên, đây là một công cụ “siêu đơn giản”. Vì thế sẽ thiếu nhiều tính năng để crawler thực sự hữu ích trên thực tế như tối ưu thời gian chạy, lên lịch chạy để luôn cập nhật được tin mới nhất, lưu vào kho dữ liệu phù hợp phục vụ tra cứu hoặc tính toán/so sánh…

Mình sẽ đưa ra một số gợi ý để các bạn có thể tiếp tục tìm hiểu và cải tiến công cụ này nhé!

  1. Sử dụng Thread để tối ưu thời gian chạy, giảm thời gian đợi giữa các lần request nội dung từng trang web. Vì mỗi trang được xử lý độc lập, việc đợi kết quả của request này sẽ không ảnh hưởng đến kết quả của các request còn lại.
  2. Sử dụng Crob Job để lên lịch chạy hằng ngày hoặc một khung thời gian cố định (ví dụ: 10 phút 1 lần). Hiện tại, các thao tác phải được kích hoạt thủ công. Việc này sẽ không giúp hệ thống có được dữ liệu mới nhất.
  3. Sử dụng một hệ CSDL cụ thể để gom dữ liệu thu thập được. Hệ CSDL sẽ giúp chúng ta có thể xử lý và đưa ra một số thông tin hữu ích. Ví dụ: so sánh giá thị trường với từng khu vực cụ thể, hoặc tìm giá tốt nhất được rao trên các trang theo nhu cầu của người dùng.

Tham khảo khóa học lập trình web 6 tháng, đảm bảo 100% công việc đầu ra!

Nguồn: https://topdev.vn/blog/xay-dung-crawler-sieu-don-gian-voi-java/


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Leave a Reply

Your email address will not be published. Required fields are marked *