Hướng dẫn web crawler

Bài viết được sự cho phép của BBT Tạp chí Lập trình

Giới thiệu

Crawler là một công cụ giúp thu thập dữ liệu, thông tin từ các trang web khác nhau. Một trong những ví dụ về crawler mà chúng ta gặp hằng ngày là Google. Google là một hệ thống có nhiều máy chủ có thể crawling rất nhiều trang web trên Internet, từ đó chúng ta có thể tìm kiếm nội dung những trang web mà chúng ta cần dựa vào từ khoá cụ thể. Hoặc là những trang web so sánh giá cả từ nhiều nguồn khác nhau [websosanh.vn], trang tin báo tổng hợp [baomoi.com] và nhiều ví dụ khác mà mình không thể liệt kê hết ở đây.

Chúng ta có thể tự viết một crawler đơn giản nhằm thu gom một số dữ liệu cơ bản nào đó. Khi hướng dẫn học viên học module 2 [Advance Programming with Java] tại CodeGym, mình thường giao bài tập xây dựng công cụ crawler này. Ví dụ thu thập giá bất động sản trên các trang rao vặt hoặc giá sản phẩm trên các trang thương mại điện tử. Qua bài viết này, mình sẽ hướng dẫn lại các bạn làm bài tập này với ngôn ngữ lập trình Java.

Nhà đất bán ...nội dung các danh mục con của mục Nhà đất bán ở đây

Nhà đất cho thuê

  • Nhà đất cho thuê ...nội dung các danh mục con của mục Nhà đất cho thuê ở đây
  • Đoạn code trên cần sửa lại như dưới đây để loại ra những link không cần thiết:

    public class DemoUsingURL {
        private static String getContentFrom[String link] throws IOException {
            ...
        }
        private static List getLinksFromMenu[String content, String menuPattern] {
            // Regex
            List links = new ArrayList[];
            Pattern p = Pattern.compile[menuPattern];
            Matcher m = p.matcher[content];
            while [m.find[]] {
                Pattern p2 = Pattern.compile["
  • "]; Matcher m2 = p2.matcher[m.group[1]]; while [m2.find[]] links.add[m2.group[1]]; } return links; } public static void main[String[] args] throws IOException { String content = getContentFrom[""]; String sellMenuPattern = "
  • Nhà đất bán
      [.*?]
    "; List sellLinks = getLinksFromMenu[content, sellMenuPattern]; String rentalMenuPattern = "
  • Nhà đất cho thuê
      [.*?]
    "; List rentalLinks = getLinksFromMenu[content, rentalMenuPattern]; System.out.println[sellLinks]; System.out.println[rentalLinks]; } }
  • Ở đoạn code trên, mình tách phần lấy nội dung từ đường dẫn trang web thành hàm getContentFrom, và một hàm tách link từ nội dung có tên là getLinksFromMenu. Hàm main sử dụng hai hàm được khai báo ở trên để lấy các đường link nằm trong mục Nhà đất bán và Nhà đất cho thuê.

    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["
  • Nhà đất bán
      [.*?]
    "]; Pattern p2 = Pattern.compile["
  • Nhà đất cho thuê
      [.*?]
    "];
  • 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["
  • "];
  • 1.4.2. Link đến nội dung chi tiết

     Pattern p = Pattern.compile["

    Chủ Đề