TÓM TẮT NỘI DUNG ĐỒ ÁN Trong môi trường ngày càng phát triển và toàn cầu hóa, việc tìm kiếm thông tin về các thành phố du lịch, khách sạn lưu trú trở nên ngày càng phổ biến và thiết thực. Tuy nhiên, thông tin về các địa điểm thường phân tán trên nhiều nguồn khác nhau, gây khó khăn cho người tìm kiếm trong việc thu thập và đánh giá chính xác thông tin. Điều này đã đặt ra yêu cầu phát triển một website giới thiệu thông tin về các thành phố, khách sạn nhằm cung cấp một nguồn tài nguyên đáng tin cậy và toàn diện cho người dùng. Hiện nay, mặc dù có một số website giới thiệu về các thành phố, nhưng chưa có nhiều nền tảng tập trung vào việc tổng hợp, phân tích và cập nhật thường xuyên thông tin về thành phố cho mục đích du lịch, đặc biệt là thông tin về khách sạn và thời tiết. Hướng tiếp cận của dự án này là tạo ra một website trực tuyến với cơ sở dữ liệu chứa thông tin về tên, quốc gia, dân số, hình ảnh, các địa điểm nên ghé thăm, các khách sạn nên ở, giá cả, mức độ hài lòng của du khách, và mục đích đến của khách khi đến các địa điểm đó... Điều này sẽ giúp người dùng dễ dàng tra cứu, so sánh và lựa chọn địa điểm phù hợp với nhu cầu du lịch của họ. Tôi đã lựa chọn hướng tiếp cận này vì nhận thấy nhu cầu của người dùng trong việc tìm kiếm thông tin du lịch về các thành phố và khách sạn ngày càng cao, và muốn đóng góp giải pháp giúp đáp ứng nhu cầu này một cách hiệu quả và tiện lợi. Tổng quan về giải pháp của tôi là phát triển một website trực tuyến với giao diện thân thiện, dễ sử dụng, và hệ thống cơ sở dữ liệu liên kết các thành phố với các thông tin tương ứng. Người dùng có thể tra cứu thông tin về thành phố, xem hình ảnh, tìm hiểu các địa điểm nên thăm và nhận đánh giá về các khách sạn từ những người đã từng lưu trú. Thông tin về khách sạn, thời tiết sẽ được cập nhật thường xuyên để giúp người dùng chuẩn bị tốt nhất cho hành trình của mình. Dự án này đã đóng góp, mang đến một nguồn thông tin đáng tin cậy và toàn diện về các thành phố, giúp người dùng tiết kiệm thời gian và nỗ lực trong việc tìm kiếm thông tin. Kết quả đạt được là cung cấp một nền tảng hữu ích cho người dùng lựa chọn địa điểm, khách sạn du lịch, tối ưu hóa trải nghiệm du lịch của họ, và góp phần thúc đẩy ngành du lịch phát triển bền vững trong thời đại số hóa ngày nay.
GIỚI THIỆU ĐỀ TÀI
Đặt vấn đề
Xuất phát từ thực tế của ngày nay, du lịch và việc tìm kiếm thông tin về các thành phố, khách sạn đã trở thành một xu hướng phổ biến và không thể thiếu trong cuộc sống hiện đại Ngày càng nhiều người cả trong và ngoài nước muốn khám phá, trải nghiệm những địa điểm mới, nhưng việc tìm kiếm thông tin liên quan đến các thành phố và khách sạn hiện vẫn gặp nhiều khó khăn Thông tin về các địa điểm thường phân tán trên nhiều nguồn khác nhau, không đồng nhất và không cập nhật đầy đủ Người dùng khi muốn tìm hiểu thông tin về một thành phố cụ thể, như tên, quốc gia, dân số, hình ảnh, các địa điểm nổi tiếng, khách sạn chất lượng, đánh giá từ du khách, và thông tin thời tiết, phải thực hiện nhiều cuộc tìm kiếm trên nhiều trang web khác nhau Điều này làm giảm trải nghiệm du lịch của họ và có thể dẫn đến sự lựa chọn không tốt.
Vấn đề này cấp thiết vì ngày càng nhiều người quan tâm đến việc du lịch và khám phá các địa điểm mới Tuy nhiên, thông tin không đáng tin cậy và không đồng nhất gây khó khăn và lo ngại cho du khách Nhu cầu tìm kiếm thông tin du lịch đã tăng cao, và một nền tảng tổng hợp thông tin đáng tin cậy về các thành phố sẽ rất hữu ích và giá trị. Để giải quyết vấn đề này, dự án đề xuất xây dựng một trang web giới thiệu thông tin về các thành phố một cách toàn diện và thống kê dữ liệu tại các khách sạn Trang web sẽ cung cấp thông tin về tên, quốc gia, dân số, hình ảnh và các địa điểm nổi tiếng của từng thành phố Nó cũng sẽ đánh giá các khách sạn dựa trên sự hài lòng của du khách, giá cả và các tiện ích Thông tin thời tiết sẽ được cập nhật thường xuyên để người dùng có thể lựa chọn thời gian thích hợp cho chuyến đi của mình.
Nền tảng này không chỉ giúp người dùng tiết kiệm thời gian và nỗ lực trong việc tìm kiếm thông tin du lịch mà còn cung cấp các lựa chọn tốt hơn cho họ Điều này giúp cải thiện trải nghiệm du lịch và tăng sự hài lòng của du khách Ngoài ra, dự án cũng có thể áp dụng vào nhiều lĩnh vực khác nhau, bao gồm các công ty du lịch,doanh nghiệp liên quan đến ngành du lịch, và các nghiên cứu về du lịch, giúp phát triển ngành du lịch một cách bền vững và hiệu quả.
Mục tiêu và phạm vi đề tài
Hiện nay, thị trường trang web du lịch như Booking.com đang rất đa dạng với nhiều trang web cung cấp các dịch vụ du lịch khác nhau như đặt phòng khách sạn,tour du lịch và vé máy bay Tuy nhiên, do mang tính đa dạng cao, nhiều trang web này có xu hướng không tập trung vào việc cô đọng thông tin và đưa ra những nội dung quan trọng, khái quát và dễ hiểu cho người dùng. Điều này có thể gây khó khăn cho người dùng trong việc tìm kiếm thông tin chính xác và quan trọng mà họ cần để chuẩn bị cho hành trình du lịch Thông tin trên các trang web này có thể phân tán và không được trình bày một cách rõ ràng, khiến người dùng mất thời gian và cảm thấy khó hiểu.
Vì vậy, mục tiêu của đề tài này là xây dựng một website giới thiệu thông tin du lịch của các thành phố, mang tính toàn diện và đáng tin cậy Website sẽ cung cấp các thông tin quan trọng về tên, quốc gia, dân số, hình ảnh, các địa điểm nổi tiếng, khách sạn chất lượng, đánh giá từ du khách, và thông tin thời tiết được cập nhật thường xuyên Mục tiêu chính là cung cấp một nền tảng hữu ích và tiện lợi cho người dùng, giúp họ tiết kiệm thời gian và tối ưu hóa trải nghiệm du lịch của mình.
Các mục tiêu cụ thể của đề tài bao gồm:
1 Hệ thống tự động thu thập dữ liệu từ các trang web du lịch uy tín như Tripad- visor bằng cách sử dụng công nghệ crawler như Scrapy và Selenium Dữ liệu sau khi được thu thập sẽ được lưu trữ và quản lý trong cơ sở dữ liệu.
2 Tạo ra một giao diện web chuyên về giới thiệu thông tin về các thành phố và khách sạn trên khắp thế giới Có chức năng tìm kiếm thông tin thành phố và khách sạn cho người dùng.
3 Trang web sẽ cung cấp thông tin chi tiết về mỗi thành phố, bao gồm tên, quốc gia, dân số, hình ảnh và danh sách các địa điểm nổi bật cần ghé thăm Đối với khách sạn, trang web sẽ cung cấp các thông tin như tên, địa chỉ, giá phòng, số lượng đánh giá từ khách hàng và các bình luận của họ.
4 Tạo ra một trang web có tính trực quan và hấp dẫn Dữ liệu thu thập được sẽ được hiển thị một cách dễ hiểu và thân thiện thông qua giao diện đẹp và tương tác, giúp người dùng có cái nhìn tổng quan và chi tiết về các thành phố và khách sạn trước khi quyết định lựa chọn điểm đến cho chuyến du lịch.
5 Mục tiêu cuối cùng của dự án là cung cấp một trang web hoàn chỉnh, tích hợp các chức năng tự động thu thập, xử lý dữ liệu, trả về kết quả đáng tin cậy và hữu ích cho người dùng trong việc khám phá các thành phố và lựa chọn khách sạn phù hợp cho hành trình du lịch của họ.
Phạm vi của đề tài sẽ tập trung vào một số thành phố và khách sạn chọn lọc từ các quốc gia khác nhau trên thế giới Thông tin về các thành phố và khách sạn này sẽ được tổng hợp và hiển thị trên website Để đảm bảo tính toàn diện và đáng tin cậy, dự án sẽ sử dụng các nguồn thông tin đáng tin cậy cho việc thu thập dữ liệu về các thành phố và khách sạn Tuy nhiên, phạm vi của dự án sẽ không bao gồm giải pháp hay ứng dụng cho việc đặt phòng khách sạn hoặc mua vé du lịch Thay vào đó, dự án tập trung vào việc cung cấp thông tin giúp người dùng lựa chọn các địa điểm và khách sạn phù hợp cho chuyến đi của họ.
Định hướng giải pháp
Hệ thống này sử dụng quy trình dưới đây để tổng hợp và xử lý thông tin du lịch từ nhiều nguồn khác nhau Đầu tiên, tôi sử dụng Scrapy và Selenium để crawl (thu thập) dữ liệu từ các nguồn dữ liệu khác nhau như trang web du lịch, API, Dữ liệu sau khi được thu thập về sẽ được đẩy vào Kafka để tiếp tục quá trình xử lý.
Sau khi dữ liệu được đẩy vào Kafka, tôi sử dụng Spark để lấy dữ liệu từ Kafka và tiến hành xử lý Spark sẽ thực hiện các tính toán và xử lý dữ liệu cần thiết để chuẩn bị dữ liệu cho việc lưu trữ vào Cơ sở dữ liệu Cassandra.
Cassandra được lựa chọn làm cơ sở dữ liệu vì khả năng mở rộng tốt và khả năng xử lý dữ liệu lớn, phù hợp với việc lưu trữ các thông tin du lịch với lượng dữ liệu lớn và mở rộng liên tục Dữ liệu sau khi xử lý bởi Spark sẽ được đẩy và lưu trữ vào Cassandra để chờ được truy vấn bởi Backend.
Backend của trang web sẽ được xây dựng bằng Flask để lấy dữ liệu từ Cassandra sau đó xử lí để hiện thị trên giao diện người dùng Giao diện người dùng sẽ được viết bằng React Js để hiển thị thông tin du lịch một cách trực quan và dễ hiểu cho người dùng.
Bố cục đồ án
Phần còn lại của báo cáo đồ án tốt nghiệp này được tổ chức như sau.
Chương 2 trình bày về các công nghệ sử dụng trong dự án Đây là các công nghệ đang được áp dụng rộng rãi hiện nay trong việc lưu trữ, xử lí dữ liệu và xây dựng website.
Chương 3, tôi giới thiệu về việc phân tích và thiết kế hệ thống Chương này sẽ chỉ ra cách hoạt động của hệ thống từ việc lấy dữ liệu, xử lí, lưu trữ và xây dựng website.
Chương 4 sẽ giới thiệu về kết quả thực nghiệm và đánh giá hệ thống đã xây dựng.
Chương 5 là kết luận và hướng phát triển cho dự án.
CÔNG NGHỆ SỬ DỤNG
Công nghệ thu thập dữ liệu
Công nghệ Scrapy là một framework mạnh mẽ được sử dụng để thu thập dữ liệu từ các trang web một cách tự động và hiệu quả Scrapy được xây dựng dựa trên ngôn ngữ lập trình Python và là một công cụ phổ biến được sử dụng rộng rãi trong việc tổng hợp thông tin và thu thập dữ liệu từ internet.
Một số tính năng nổi bật của Scrapy bao gồm:
• Cú pháp đơn giản: Scrapy cung cấp cú pháp dễ hiểu và dễ sử dụng, giúp nhà phát triển tập trung vào việc xây dựng logic thu thập dữ liệu mà không cần lo lắng về việc xử lý phức tạp của mạng và HTML.
• Hỗ trợ cho đa trình duyệt: Với Scrapy, người dùng có thể sử dụng các trình duyệt phổ biến như Chrome hoặc Firefox thông qua Selenium để thu thập dữ liệu từ các trang web sử dụng JavaScript.
• Xử lý tùy chỉnh và lọc dữ liệu: Scrapy cho phép người dùng tùy chỉnh quy trình xử lý dữ liệu, bao gồm lọc dữ liệu theo yêu cầu và lựa chọn các thông tin cần thiết.
• Hỗ trợ cho proxy và user-agent: Scrapy hỗ trợ sử dụng proxy và user-agent giúp ẩn danh và tránh việc bị chặn khi thu thập dữ liệu từ các trang web.
Với những ưu điểm trên thì Scrapy rất phù hợp cho việc thu thập lượng lớn dữ liệu một cách liên tục với tốc độ cao Tuy nhiên vẫn có nhiều hạn chế như không hỗ trợ đa luồng, khó thao tác với cấu trúc trang web phức tạp, xử lý JavaScript không tốt.
Selenium là một công nghệ quan trọng được sử dụng trong dự án này để mô phỏng các hành động của người dùng trên trình duyệt Được xây dựng dựa trên ngôn ngữ lập trình Python, Selenium cho phép tự động thao tác trên các trang web sử dụng JavaScript và thu thập dữ liệu từ những trang web có cấu trúc phức tạp.
Một số tính năng quan trọng của Selenium bao gồm:
• Tự động hoá trình duyệt: Selenium cho phép tự động hoá các hành động trên trình duyệt, bao gồm nhập liệu, nhấp chuột và điều hướng trang web Điều này giúp tôi thu thập dữ liệu từ các trang web có các tương tác phức tạp như load dữ liệu bằng JavaScript.
• Hỗ trợ nhiều trình duyệt: Selenium hỗ trợ nhiều trình duyệt phổ biến như Chrome, Firefox, Edge và Safari, giúp lựa chọn trình duyệt phù hợp với yêu cầu và điều kiện của dự án.
• Kiểm tra tự động: Selenium không chỉ được sử dụng để crawl dữ liệu, mà còn hỗ trợ thực hiện kiểm tra tự động trên ứng dụng web, giúp đảm bảo tính chính xác và hoạt động đúng đắn của trang web.
• Xử lý AJAX: Selenium hỗ trợ xử lý các yêu cầu AJAX một cách hiệu quả, giúp đảm bảo dữ liệu được thu thập đầy đủ và chính xác từ trang web.
Mặc dù Selenium mang lại nhiều lợi ích trong việc mô phỏng các hoạt động người dùng trên trình duyệt và thu thập dữ liệu từ các trang web phức tạp, tuy nhiên, việc sử dụng Selenium cũng đòi hỏi cần phải quản lý tốt việc xử lý dữ liệu sau khi crawl và tốc độ thu thập dữ liệu không cao.
2.1.3 Kết hợp Scrapy và Selenium
Với ưu nhược điểm của 2 công nghệ trên, việc kết hợp hài hòa giữa chúng sẽ đem lại hiệu quả cao khi thu thập dữ liệu như:
• Thu thập dữ liệu đa dạng: Scrapy chủ yếu được sử dụng để crawl dữ liệu từ các trang web dễ truy cập, không sử dụng JavaScript Tuy nhiên, một số trang web du lịch sử dụng JavaScript để hiển thị thông tin động và tương tác người dùng.
Sử dụng Selenium kết hợp với Scrapy cho phép crawl và thu thập dữ liệu từ các trang web này, mở rộng khả năng thu thập dữ liệu đa dạng và phong phú.
• Truy cập vào dữ liệu phức tạp: Một số trang web có cấu trúc phức tạp hoặc yêu cầu tương tác động với người dùng, làm cho việc crawl trở nên khó khăn với Scrapy truyền thống Bằng cách sử dụng Selenium để mô phỏng các hành động của người dùng trên trình duyệt, tôi có thể thu thập dữ liệu từ những trang web phức tạp này một cách hiệu quả.
Apache Kafka
Apache Kafka là một hệ thống xử lý dữ liệu mã nguồn mở được thiết kế để xử lý và quản lý các luồng dữ liệu trong thời gian thực Nó được phát triển bởi Apache Software Foundation và được xây dựng trên ngôn ngữ Java Kafka đã trở thành một trong những công nghệ phổ biến nhất trong việc xử lý dữ liệu phân tán và truyền tải thông tin giữa các ứng dụng, đặc biệt trong các hệ thống lớn và phức tạp.
Các đặc điểm quan trọng của Apache Kafka bao gồm:
• Hệ thống xử lý luồng dữ liệu: Kafka cho phép xử lý và truyền tải dữ liệu từ hàng tỷ sự kiện/thông điệp trong thời gian thực Nó hỗ trợ việc quản lý các luồng dữ liệu lớn và hiệu quả với khả năng mở rộng cao.
• Hàng đợi sự kiện (Event queue): Kafka hoạt động như một hệ thống hàng đợi sự kiện, nơi các sự kiện và thông điệp được lưu trữ tạm thời trước khi được xử lý bởi các ứng dụng tiêu thụ.
• Đa luồng và bền vững: Kafka được thiết kế để có thể hoạt động với đa luồng và bền vững, đảm bảo tính sẵn sàng và ổn định khi xử lý dữ liệu lớn.
• Khả năng mở rộng: Kafka có khả năng mở rộng linh hoạt bằng cách thêm vào các node máy chủ mới để xử lý tải dữ liệu ngày càng lớn.
• Hỗ trợ cho Stream Processing: Kafka hỗ trợ xử lý luồng dữ liệu thời gian thực bằng cách tích hợp với các công nghệ xử lý luồng như Apache Flink, Apache Spark Streaming, hay Apache Storm.
Apache Kafka đã được ứng dụng rộng rãi trong các lĩnh vực như ghi nhật ký (log- ging), thu thập dữ liệu từ máy chủ, phân tích dữ liệu thời gian thực, và các ứng dụng IoT (Internet of Things) Trong dự án này, Kafka được sử dụng để làm hàng đợi dữ liệu từ các công cụ crawl và là nơi lưu trữ tạm thời dữ liệu để xử lý trước khi lưu vào cơ sở dữ liệu Điều này giúp tối ưu hóa việc quản lý dữ liệu, cung cấp thông tin đồng bộ và hiệu quả cho ứng dụng web.
Apache Spark
Apache Spark là một hệ thống xử lý dữ liệu mã nguồn mở được thiết kế để xử lý công việc phân tán trên các cụm máy tính lớn và xử lý dữ liệu ở quy mô lớn Nó là một trong những công nghệ phổ biến nhất trong việc xử lý dữ liệu phân tán và tính toán song song trên các dữ liệu lớn và phức tạp.
Các đặc điểm quan trọng của Apache Spark bao gồm:
• Xử lý dữ liệu phân tán: Spark cho phép xử lý dữ liệu phân tán trên nhiều cụm máy tính thông qua mô hình tính toán song song Điều này giúp tăng tốc độ xử lý và khả năng mở rộng của hệ thống khi xử lý dữ liệu lớn.
• Tích hợp nhiều ngôn ngữ lập trình: Spark hỗ trợ nhiều ngôn ngữ lập trình như Scala, Java, Python và R, giúp cho những nhà phát triển có thể làm việc với ngôn ngữ mà họ quen thuộc.
• Bộ thư viện phong phú: Spark cung cấp một bộ thư viện phong phú cho xử lý dữ liệu, bao gồm các thư viện cho xử lý batch (Spark Core), xử lý luồng (Spark Streaming), xử lý SQL (Spark SQL), học máy (Spark MLlib) và xử lý dữ liệu đồ thị (GraphX).
• Hiệu suất cao: Spark được thiết kế với các cơ chế tối ưu hóa để tăng hiệu suất xử lý dữ liệu, bao gồm việc lưu trữ dữ liệu tạm thời trong bộ nhớ và tối ưu hóa phân vùng dữ liệu.
• Xử lý dữ liệu thời gian thực: Spark cung cấp Spark Streaming để xử lý dữ liệu thời gian thực và xử lý luồng dữ liệu từ các nguồn như Apache Kafka hoặc Flume.
Apache Spark đã được sử dụng rộng rãi trong nhiều lĩnh vực như xử lý dữ liệu lớn, phân tích dữ liệu, học máy, xử lý dữ liệu thời gian thực, và nhiều ứng dụng phân tích dữ liệu Trong dự án này, Apache Spark được sử dụng để xử lý dữ liệu sau khi thu thập từ Kafka, trích xuất thông tin cần thiết và chuẩn bị dữ liệu để lưu vào cơ sở dữ liệu Cassandra Điều này giúp tối ưu hóa quá trình xử lý dữ liệu và cung cấp thông tin đáng tin cậy và hiệu quả cho ứng dụng web.
Trong việc xử lý dữ liệu bằng Spark, việc xác định cảm xúc, quan điểm tích cực, tiêu cực của các bài đánh giá cũng rất quan trọng Vì vậy tôi đã áp dụng thư viện VaderSentiment trong phân tích.
Thuật toán của VaderSentiment được xây dựng dựa trên cơ sở lý thuyết Vader (Valence Aware Dictionary and sEntiment Reasoner dựa trên quy tắc/từ vựng trong NLTK) để phân tích cảm xúc trong văn bản Cơ sở lý thuyết này bao gồm việc sử dụng một từ điển (lexicon) lớn để đánh giá tích cực (positive) và tiêu cực (negative) cho các từ cụ thể, cũng như cân nhắc mức độ của cảm xúc Một số đặc điểm nổi bật của VaderSentiment bao gồm:
• Đơn giản và dễ sử dụng: VaderSentiment cung cấp một giao diện đơn giản và dễ sử dụng, cho phép các nhà phát triển thực hiện phân tích cảm xúc trong văn bản một cách nhanh chóng và thuận tiện.
• Xử lý tiếng Anh hiệu quả: Thư viện này đặc biệt hiệu quả trong việc phân tích cảm xúc cho văn bản tiếng Anh, nhưng có thể không hiệu quả cho các ngôn ngữ khác.
• Phân tích cảm xúc đa chiều: VaderSentiment không chỉ xác định cảm xúc tích cực và tiêu cực trong văn bản, mà còn đo lường cường độ của cảm xúc, bao gồm tính đến các cảm xúc trung tính và phân loại chúng thành các mức độ khác nhau.
• Độ chính xác cao: Thư viện này thường đạt được độ chính xác cao trong việc phân tích cảm xúc và đánh giá tính tích cực hay tiêu cực của văn bản.
• Không yêu cầu dữ liệu huấn luyện
• Hiểu quan điểm của văn bản có chứa biểu tượng cảm xúc, tiếng lóng, liên từ, v.v.
• Tối ưu cho văn bản trên mạng xã hội
• Thư viện mã nguồn mở
VaderSentiment đã được sử dụng rộng rãi trong nhiều ứng dụng phân tích cảm xúc,phân loại văn bản, và phân tích ý kiến của người dùng trên mạng xã hội và các nền tảng trực tuyến khác Trong dự án của tôi, VaderSentiment được sử dụng để phân tích cảm xúc cho đánh giá và bình luận từ du khách về khách sạn, giúp đánh giá tích cực hay tiêu cực cho các khách sạn và đưa ra thông tin phản hồi cho người dùng một cách chính xác.
Apache Cassandra
Apache Cassandra là một cơ sở dữ liệu phân tán mã nguồn mở được thiết kế để xử lý dữ liệu lớn và phức tạp với tính chất phân tán và có khả năng mở rộng cao Nó được phát triển bởi Apache Software Foundation và dựa trên các công nghệ phân tán của Amazon DynamoDB và Google Bigtable Cassandra đã trở thành một trong những cơ sở dữ liệu phổ biến trong việc xử lý dữ liệu không gian hàng đợi, xử lý dữ liệu thời gian thực và các ứng dụng web có yêu cầu hiệu năng cao.
Các đặc điểm nổi bật của Apache Cassandra bao gồm:
1 Cấu trúc cơ sở dữ liệu phân tán: Cassandra dựa trên kiến trúc cơ sở dữ liệu phân tán, cho phép dữ liệu được lưu trữ và quản lý trên nhiều nút máy tính Việc phân tán dữ liệu giúp tăng hiệu năng và khả năng mở rộng của hệ thống khi có thêm nút máy tính.
2 Khả năng mở rộng ngang: Cassandra hỗ trợ khả năng mở rộng ngang linh hoạt bằng cách thêm vào các nút máy tính mới vào cụm Điều này cho phép hệ thống xử lý dữ liệu lớn và mở rộng mà không ảnh hưởng đến hiệu suất.
3 Bất đồng bộ và hỗ trợ thời gian thực: Cassandra hỗ trợ ghi và đọc dữ liệu bất đồng bộ, giúp tăng hiệu năng xử lý dữ liệu Nó cũng hỗ trợ xử lý dữ liệu thời gian thực và có khả năng lưu trữ và truy vấn dữ liệu theo thời gian.
4 Hỗ trợ truy vấn CQL: Cassandra hỗ trợ ngôn ngữ truy vấn CQL (Cassandra Query Language), giúp dễ dàng thực hiện các truy vấn và thao tác với dữ liệu.
5 Bền vững và độ tin cậy cao: Cassandra được thiết kế để đảm bảo bền vững và độ tin cậy cao, giúp đảm bảo dữ liệu luôn sẵn sàng và an toàn.
Apache Cassandra đã được sử dụng rộng rãi trong nhiều ứng dụng và lĩnh vực,bao gồm các hệ thống web lớn, phân tích dữ liệu, hệ thống IoT, và các ứng dụng có yêu cầu hiệu suất và khả năng mở rộng cao Trong dự án trang web giới thiệu thông tin về các thành phố, Apache Cassandra có thể được sử dụng để lưu trữ và quản lý dữ liệu thu thập từ các crawler và xử lý bởi Apache Spark, giúp cung cấp dữ liệu đáng tin cậy và hiệu quả cho trang web.
Flask
Flask là một micro-framework mã nguồn mở được viết bằng Python, được sử dụng để xây dựng các ứng dụng web nhỏ và trung bình với độ phức tạp thấp Được tạo ra bởi Armin Ronacher, Flask được thiết kế để đơn giản, linh hoạt và dễ dàng học hơn so với các framework web khác trong Python.
Các đặc điểm nổi bật của Flask bao gồm:
• Nhỏ gọn và đơn giản: Flask là một micro-framework, có ít đặc tính tích hợp sẵn, giúp giảm độ phức tạp và giúp nhà phát triển dễ dàng tùy chỉnh ứng dụng theo ý muốn.
• Dễ dàng học và sử dụng: Flask có cú pháp đơn giản và dễ hiểu, cho phép các nhà phát triển mới dễ dàng học và sử dụng mà không cần quá nhiều kiến thức trước đó về web development.
• Hỗ trợ mở rộng: Mặc dù Flask là một micro-framework, nhưng nó hỗ trợ mở rộng thông qua việc sử dụng các extensions và thư viện bên thứ ba Điều này cho phép nhà phát triển mở rộng tính năng của ứng dụng một cách linh hoạt theo nhu cầu.
• Tích hợp Jinja2: Flask tích hợp Jinja2, một hệ thống template engine mạnh mẽ và linh hoạt, giúp hiển thị dữ liệu dễ dàng và trực quan trên trình duyệt.
• Hỗ trợ RESTful: Flask hỗ trợ xây dựng các ứng dụng RESTful API, giúp truyền tải dữ liệu giữa máy chủ và ứng dụng web một cách hiệu quả.
Flask đã được sử dụng rộng rãi trong việc xây dựng các ứng dụng web nhỏ và trung bình, các dự án khởi nghiệp, và các dự án yêu cầu tính linh hoạt và hiệu suất cao.
Trong dự án của tôi, do không yêu cầu xử lý các yêu cầu phức tạp và khả năng chịu taricao, Flask được sử dụng làm backend để xử lý các yêu cầu từ người dùng, truy vấn dữ liệu từ cơ sở dữ liệu Cassandra và trả về các thông tin chi tiết về thành phố và khách sạn được hiển thị trên giao diện React Js của trang web.
ReactJS
ReactJS là một thư viện mã nguồn mở được phát triển bởi Facebook, được sử dụng để xây dựng giao diện người dùng hiện đại cho các ứng dụng web Với thiết kế dựa trên các thành phần (component-based), ReactJS giúp tái sử dụng mã và tạo ra các giao diện tương tác phức tạp một cách dễ dàng.
Các đặc điểm nổi bật của ReactJS bao gồm:
• Component-based: ReactJS xây dựng giao diện bằng cách tạo ra các thành phần độc lập, tái sử dụng được Những thành phần này có thể được kết hợp lại với nhau để tạo thành giao diện người dùng hoàn chỉnh, giúp dễ dàng quản lý mã và phát triển ứng dụng một cách hiệu quả.
• Virtual DOM: ReactJS sử dụng Virtual DOM để quản lý hiệu năng và tăng tốc việc cập nhật giao diện Virtual DOM là một phiên bản dự phòng của DOM thực sự, giúp giảm thiểu số lượng thao tác với DOM khi có thay đổi dữ liệu, đảm bảo ứng dụng chạy mượt mà và hiệu quả.
• JSX (JavaScript XML): ReactJS cho phép bạn sử dụng JSX, một phần mở rộng của JavaScript, để viết mã HTML tương tự như viết template JSX giúp làm cho việc tạo giao diện trở nên dễ dàng và trực quan hơn.
• Khả năng tái sử dụng: Với việc xây dựng giao diện dựa trên thành phần, Re- actJS giúp bạn tái sử dụng mã một cách hiệu quả, giúp tiết kiệm thời gian và nỗ lực trong quá trình phát triển ứng dụng.
• Hỗ trợ cộng đồng đa dạng: ReactJS là một thư viện phổ biến và có một cộng đồng người dùng đông đảo và sôi nổi.
ReactJS đã được sử dụng rộng rãi trong việc xây dựng các ứng dụng web phức tạp, các ứng dụng di động và các ứng dụng đơn trang (single-page applications).
Với khả năng tái sử dụng, hiệu năng cao và tích hợp tốt với các công nghệ khác, tôi đã chọn ReactJS cho dự án của mình.
Docker
Docker là một nền tảng mã nguồn mở cho việc đóng gói, triển khai và chạy các ứng dụng trong các container Containers là một phương pháp ảo hóa dạng hạt nhằm tạo ra môi trường độc lập và cô lập, cho phép các ứng dụng chạy một cách đáng tin cậy và dễ dàng di chuyển giữa các máy chủ và môi trường khác nhau.
Các đặc điểm nổi bật của Docker bao gồm:
• Đóng gói ứng dụng: Docker cho phép bạn đóng gói toàn bộ ứng dụng và các phụ thuộc của nó vào một container duy nhất Điều này giúp đảm bảo rằng ứng dụng sẽ chạy một cách nhất quán trên mọi môi trường từ máy tính cá nhân đến các máy chủ phức tạp.
• Cô lập ứng dụng: Các container Docker hoạt động độc lập và cô lập với nhau,đảm bảo rằng các ứng dụng và các thành phần của chúng không tác động lẫn nhau Điều này giúp tránh các xung đột và xung đột tài nguyên giữa các ứng dụng.
• Dễ dàng di chuyển và triển khai: Do đóng gói ứng dụng vào các container, Docker cho phép bạn dễ dàng di chuyển và triển khai các ứng dụng trên môi trường phát triển, thử nghiệm và sản xuất một cách nhanh chóng và hiệu quả.
• Tích hợp hóa: Docker tích hợp với nhiều công nghệ và dịch vụ khác, cho phép sử dụng các công cụ quen thuộc như Kubernetes để quản lý và triển khai các ứng dụng trên nền tảng Docker.
• Hiệu năng cao: Với cơ chế ảo hóa dạng hạt, Docker cho phép ứng dụng chạy với hiệu năng cao, tiết kiệm tài nguyên và giảm thời gian khởi động.
Docker đã trở thành một công nghệ quan trọng trong việc triển khai và quản lý các ứng dụng hiện đại Nó được sử dụng rộng rãi trong các môi trường phát triển,thử nghiệm và sản xuất, giúp đơn giản hóa quy trình triển khai và đảm bảo tính đáng tin cậy và hiệu quả cho các ứng dụng Do sử dụng rất nhiều công nghệ khác nhau nên việc đóng gói bằng Docker rất thuận tiện để triển khai.
Crontab
Crontab là một tiện ích trong các hệ điều hành dựa trên UNIX, cho phép người dùng lên lịch chạy các tác vụ tự động theo thời gian xác định Điều này rất hữu ích khi muốn thực hiện các công việc định kỳ hoặc lập lịch cho các tác vụ trong hệ thống.
Crontab hoạt động dựa trên việc đọc các tệp cấu hình chứa thông tin về lịch trình của các tác vụ Người dùng có thể thêm, chỉnh sửa và xóa các tác vụ trong crontab để điều chỉnh thời gian thực hiện theo ý muốn Các tác vụ có thể là các lệnh dòng lệnh, kịch bản shell, hay các chương trình thực thi khác.
Việc sử dụng crontab giúp tối ưu hóa quy trình làm việc, giảm tải công việc thủ công, và đảm bảo các tác vụ quan trọng được thực hiện đúng thời gian và định kỳ.
Các tác vụ trong crontab có thể chạy hàng giờ, hàng ngày, hàng tuần, hay theo bất kỳ chu kỳ thời gian nào.
Crontab là một công cụ mạnh mẽ và linh hoạt, thích hợp cho việc tổ chức và lên lịch các công việc tự động trong môi trường hệ điều hành dựa trên UNIX Nó giúp người dùng quản lý và kiểm soát các tác vụ lên lịch một cách hiệu quả, đồng thời tăng tính tự động hóa và tiết kiệm thời gian trong quá trình thực hiện các công việc định kỳ, phù hợp với hệ thống có cấu hình không cao.
Trên đây là các công nghệ đã được sử dụng trong dự án của tôi Phần tiếp theo sẽ giới thiệu về cách thiết kệ hệ thống và kết hợp các công nghệ trên với nhau.
PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
Kiến trúc tổng quan
Hình 3.1: Kiến trúc tổng quan
Người sử dụng hệ thống:
• Người dùng muốn tìm kiếm thông tin du lịch của các thành phố, thông tin về các khách sạn.
• Hệ thống cho phép người dùng tương tác thông qua giao diện web.
Tầng ứng dụng:Cung cấp các chức năng của hệ thống
• Tìm kiếm thông tin du lịch của thành phố: Sử dụng chức năng tìm kiếm thông qua tên của thành phố.
• Tìm kiếm thông tin khách sạn: Sử dụng chức năng tìm kiếm thông qua tên của khách sạn.
• Giới thiệu chung về thành phố.
• Thông tin vị trí địa lí của thành phố.
• Thông tin về khách sạn.
• Thông tin về thời tiết của thành phố.
• Thông tin về dân số của thành phố.
Hệ thống crawl dữ liệu:
• Dữ liệu được thu thập và xử lý được cập nhật thường xuyên vào cơ sở dữ liệu.
Tổng quan yêu cầu chức năng
Tổng quan yêu cầu chức năng của hệ thống:
• Thu thập dữ liệu: Hệ thống cần có khả năng thu thập thông tin về các khách sạn, địa điểm và các thông tin du lịch từ trang web Tripadvisor.com thông qua việc sử dụng các crawler(công cụ thu thập dữ liệu).
• Lưu trữ dữ liệu: Dữ liệu thu thập được từ Tripadvisor.com cần được lưu trữ một cách hiệu quả và an toàn Hệ thống cần sử dụng cơ sở dữ liệu Cassandra để lưu trữ và quản lý dữ liệu này.
• Xử lý dữ liệu: Sau khi thu thập, dữ liệu cần được đưa vào hàng đợi Kafka để chuẩn bị cho quá trình xử lý tiếp theo bởi cụm Spark.
• Truy vấn dữ liệu: Hệ thống cần cung cấp API và backend để truy xuất dữ liệu từ cơ sở dữ liệu Cassandra và đáp ứng các yêu cầu truy vấn từ phía người dùng.
Yêu cầu phi chức năng
Yêu cầu phi chức năng của hệ thống:
• Hiệu năng: Hệ thống cần đáp ứng được lượng truy vấn lớn từ người dùng mà vẫn đảm bảo hiệu năng cao và thời gian đáp ứng nhanh chóng.
• Bảo mật: Dữ liệu thu thập và lưu trữ cần được bảo mật và không được tiết lộ cho bất kỳ ai ngoài nhóm phát triển và quản lý.
• Khả năng mở rộng: Hệ thống cần hỗ trợ khả năng mở rộng để có thể xử lý lượng dữ liệu ngày càng tăng và đáp ứng nhu cầu của người dùng trong tương lai.
• Ổn định: Hệ thống cần ổn định và có khả năng phục hồi khi gặp sự cố để đảm bảo rằng dữ liệu không bị mất.
• Dễ sử dụng: Giao diện người dùng của hệ thống cần được thiết kế dễ sử dụng và thân thiện với người dùng để đảm bảo tính tiện dụng và hài lòng của người sử dụng.
3.4 Mô hình kiến trúc hệ thống
Dưới đây là mô hình kiến trúc hệ thống dùng để triển khai dự án này:
Hình 3.2: Mô hình kiến trúc hệ thống
Trên đây là mô hình kiến trúc hệ thống của dự án này Luồng chương trình thực hiện crawl dữ liệu như sau:
• Đầu tiên, một crawler sẽ thu thập URL của các khách sạn tốt nhất tại các thành phố trên trang web Tripadvisor theo ngày Những URL này sau đó sẽ được đẩy vào Redis để tạo ra hàng đợi.
• Redis đảm nhiệm việc quản lý hàng đợi, chứa các URL thu thập được, và gửi chúng đến các node phía sau để thực hiện việc crawl dữ liệu cũng như đảm bảo khả năng chạy ổn định của các node đang crawl dữ liệu.
• Khi crawl dữ liệu của 10 khách sạn hoàn thành, dữ liệu được lưu vào hàng đợiKafka ngay lập tức để tránh mất mát và chuẩn bị cho quá trình xử lý tiếp theo.
Việc này lặp lại đến khi không còn URL trong hàng đợi.
• Cụm Spark sẽ tiến hành đọc dữ liệu từ các topic trong Kafka để tiến hành xử lí và đẩy dữ liệu vào trong Cassandra.
• Dữ liệu được 1 crawler thu thập hằng tuần do dữ liệu các thành phố không cập nhật thường xuyên Dữ liệu sau đó được đẩy vào trong Cassandra.
• Backend của ứng dụng sẽ gọi dữ liệu từ Cassandra hoặc các API để phục vụ truy vấn của người dùng tại Frontend Điều này giúp đảm bảo người dùng nhận được thông tin chính xác và nhanh chóng khi tương tác với giao diện của ứng dụng.
Luồng chương trình trên được thực thi hằng ngày đối với dữ liệu khách sạn phục vụ việc phân tích phía sau Dữ liệu thành phố không thường xuyên cập nhật nên sẽ được crawl hằng tuần để đảm bảo hiệu năng.
Thu thập dữ liệu
Tripadvisor.com:Tripadvisor là một trang web hàng đầu trong lĩnh vực du lịch và đánh giá dịch vụ du lịch trên toàn thế giới Trang web này cung cấp thông tin và đánh giá về các điểm đến, khách sạn, nhà hàng, hoạt động giải trí và các hoạt động du lịch khác ở hơn 8 triệu địa điểm trên khắp thế giới Tripadvisor cung cấp đánh giá, nhận xét của người dùng, hình ảnh và video thực tế của người dùng, bảng giá phòng, Đây là trang web với nội dung đa dạng và số lượng người dùng rất nhiều, dữ liệu được sinh ra liên tục nên được chọn là nguồn dữ liệu cho dự án Các dữ liệu được thu thập bao gồm:
• Thông tin về khách sạn: Tên, địa chỉ, giá phòng, đánh giá trung bình.
• Thông tin của người đánh giá: Tên, địa chỉ (nếu có), số lượt đánh giá.
• Review của khách đặt phòng: Ngày đánh giá, nội dung đánh giá, loại hình du lịch, số sao đánh giá.
• Thông tin các thành phố: Hình ảnh, giới thiệu về thành phố (nếu có), các địa điểm nên đến (nếu có), các khách sạn tốt nhất.
• URL của các thành phố, khách sạn trên trang web này.
Api-ninjas.com:Api-ninjas.com cung cấp API chứa thông tin về các thành phố với các thông tin như kinh độ, vĩ độ, dân số, quốc gia.
Open-meteo.com: Open-meteo.com là trang web cung cấp API thời tiết miễn phí cho người dùng với số lượng miễn phí khoảng 50000 requests 1 ngày Trang web này cung cấp lịch sử thời tiết tại các địa điểm theo tọa độ.
Trang web Tripadivisor.com sử dụng JavaScript render tại Client và rất dễ chặn IP khi phát hiện truy cập cao đột biến khiến việc sử dụng Scrapy đơn thuần khó thực hiện Vì vậy tôi đã sử dụng Selenium để giải quyết việc này vì những lợi ích sau:
• Xử lý nội dung động: TripAdvisor sử dụng nhiều JavaScript để hiển thị thông tin đa dạng và nội dung động Selenium có khả năng tương tác với trang web và xử lý các yêu cầu AJAX, cho phép thu thập thông tin trên các trang động.
• Sử dụng User-Agent: Đối với mỗi trình duyệt, Selenium cho phép người dùng tùy chỉnh User-Agent để giả mạo trình duyệt và tránh bị phát hiện là bot Vì vậy tôi đã thiết lập User-Agent tương tự như trình duyệt thực nên có thể giả mạo thành người dùng thực sự khi truy cập vào TripAdvisor.
• Ngoài ra Selenium thêm độ trễ (Delay) để tránh bị phát hiện và chặn, Selenium có thể được cấu hình để tạo ra một độ trễ ngẫu nhiên giữa các thao tác tương tác với trang web Điều này giúp tạo ra một mô hình hành vi giống như người dùng thực và tránh sự đột ngột trong luồng dữ liệu.
Tiếp theo, để tối ưu hiệu năng khi sử dụng Selenium tôi đã cấu hình như sau:
Các argument dưới đây là các tùy chọn cấu hình cho trình duyệt Chrome khi sử dụng Selenium:
• ’disable-popup-blocking’: Vô hiệu hóa chặn cửa sổ pop-up Điều này cho phép trình duyệt mở các cửa sổ pop-up mà không bị chặn, cho phép các tác vụ thao tác với chúng nếu cần.
• ’–headless’: Chế độ chạy trình duyệt "headless" (không có giao diện người dùng) Khi kích hoạt chế độ này, trình duyệt sẽ không hiển thị trên màn hình, giúp giảm tải tài nguyên máy tính và tăng tốc độ chạy.
• ’–disable-gpu’: Vô hiệu hóa GPU trong trình duyệt Điều này giúp tránh một số vấn đề liên quan đến hiển thị trang web trong môi trường không có giao diện người dùng.
• ’–no-sandbox’: Vô hiệu hóa chế độ "sandbox" của trình duyệt Sandbox là một lớp bảo mật giữa trình duyệt và hệ thống máy tính, nhằm giới hạn khả năng tác động của trình duyệt đối với hệ thống Tuy nhiên, trong môi trường headless, việc vô hiệu hóa sandbox có thể giúp tăng tốc độ chạy và giảm nguy cơ lỗi.
• ’–disable-dev-shm-usage’: Vô hiệu hóa việc sử dụng shared memory trong trình duyệt Shared memory là một cơ chế để chia sẻ dữ liệu giữa các quy trình của trình duyệt Tuy nhiên, trong môi trường headless, việc vô hiệu hóa shared memory có thể giúp giảm tải tài nguyên máy tính.
• ’–blink-settings=imagesEnabledse’: Vô hiệu hóa hiển thị hình ảnh trên trang web Điều này giúp giảm tải dữ liệu và tăng tốc độ tải trang, đồng thời cũng hữu ích khi tôi chỉ quan tâm đến dữ liệu văn bản thay vì hình ảnh.
Các tùy chọn cấu hình này giúp tối ưu hóa việc sử dụng trình duyệt Chrome trong môi trường Selenium, đảm bảo hiệu suất và tốc độ chạy tốt hơn khi thao tác với các trang web sử dụng JavaScript.
Ngoài ra, tôi đã cài đặt thời gian crawler chờ đợi cho trang web được tải xong là 1 giây Đồng thời tôi đã sử dụng Selenium để mô phỏng thao tác Click vào phần
"Read more" trong bình luận của người dùng. Đây là bình luận đã rút gọn:
Hình 3.4: Bình luận thu gọn
Và đây là bình luận đầy đủ:
Hình 3.5: Bình luận đầy đủ
Việc chờ đợi và click này sẽ tăng thời gian crawl dữ liệu nhưng sẽ đảm bảo được dữ liệu trả về đầy đủ nhất phục vụ cho xử lý phân tích phía sau.
Xử lý dữ liệu
Sau khi dữ liệu thô được đưa vào Kafka, Spark sẽ tiến hành lấy dữ liệu này từ các topic và tiến hành xử lí Spark phù hợp với hệ thống hiện có của tôi vì nó có những tính năng và khả năng giúp tối ưu hóa xử lý dữ liệu phân tán và tích hợp dữ liệu từ nhiều nguồn khác nhau Dưới đây là các điểm phù hợp của Spark với hệ thống đang có:
• Xử lý dữ liệu lớn: Hệ thống của tôi đang xử lý một lượng lớn dữ liệu hàng ngày, và Spark hỗ trợ xử lý dữ liệu trên bộ nhớ, giúp tăng tốc độ xử lý và giảm thiểu thời gian truy cập dữ liệu từ đĩa Điều này giúp cải thiện hiệu suất và thời gian xử lý của hệ thống.
• Tính mở rộng cao: Spark cho phép tôi dễ dàng mở rộng hệ thống bằng cách thêm nút vào cụm, giúp đáp ứng nhu cầu xử lý dữ liệu ngày càng lớn mà không ảnh hưởng đến hiệu suất Điều này giúp hệ thống đáng tin cậy và sẵn sàng khi đối mặt với tải cao.
• Đa dạng công cụ và thư viện: Spark hỗ trợ nhiều công cụ và thư viện xử lý dữ liệu như Spark SQL, Spark Streaming, Spark MLlib và GraphX Điều này cho phép tôi dễ dàng xử lý và phân tích dữ liệu từ nhiều nguồn khác nhau và thực hiện các tác vụ phức tạp như xử lý dữ liệu dạng bảng, phân tích dữ liệu theo thời gian thực và xây dựng mô hình học máy.
• Hỗ trợ đa ngôn ngữ: Spark hỗ trợ nhiều ngôn ngữ lập trình như Java, Scala, Python và R, cho phép đội ngũ phát triển sử dụng ngôn ngữ ưa thích của họ để phát triển ứng dụng Điều này giúp tối ưu hiệu quả phát triển và tích hợp với hệ thống hiện có.
Tóm lại, Spark là một lựa chọn lý tưởng cho hệ thống hiện có của tôi vì nó cung cấp các tính năng mạnh mẽ để tối ưu hóa xử lý dữ liệu phân tán, hỗ trợ mở rộng và tích hợp dữ liệu từ nhiều nguồn khác nhau Sự kết hợp giữa hiệu suất, tính linh hoạt và khả năng mở rộng đã làm cho Spark trở thành một giải pháp phù hợp và tiện ích cho hệ thống của tôi.
Sau khi làm sạch thì dữ liệu sẽ được lưu trong các trường như:
1 hotel-url: Địa chỉ URL của khách sạn.
2 hotel-name: Tên của khách sạn.
3 total-hotel-reviews: Tổng số bình luận về khách sạn.
4 star: Đánh giá số sao của khách sạn (kiểu dữ liệu float).
5 hotel-address: Địa chỉ của khách sạn.
6 price: Giá tiền của khách sạn.
7 review-date: Ngày được đánh giá khách sạn.
8 reviewer-rating: Điểm đánh giá của người đánh giá khách sạn.
9 reviewer-contribution: Số lượng đóng góp của người đánh giá (kiểu dữ liệu integer).
10 reviewer-link: Đường dẫn đến tài khoản trên trang Tripadvisor của người đánh giá.
11 reviewer-title-comment: Tiêu đề của bình luận của người đánh giá.
12 reviewer-comment: Nội dung bình luận của người đánh giá.
13 reviewer-stay-date: Ngày lưu trú của người đánh giá.
14 reviewer-trip-type: Loại hình chuyến đi của người đánh giá.
15 reviewer-nation: Quốc gia của người đánh giá.
16 hotel-language: Ngôn ngữ của khách sạn.
17 sentiment-score: Điểm số của bình luận từ khách du lịch khi áp dụng thư viện vaderSentiment.
Sau khi có dữ liệu sạch, tôi tiến hành đưa chúng vào trong Cassandra.
3.6.2 Xử lý dữ liệu thành phố
Dữ liệu về các thành phố trên trang Tripadvisor rất đa dạng, vì vậy tôi chỉ tập trung lấy các trường sau:
1 city-id: Mã thành phố.
2 city-name: Tên thành phố.
3 country-name: Tên quốc gia.
4 city-image: Hình ảnh của thành phố.
5 title: Tiêu đề giới thiệu thành phố.
6 intro: Nội dung giới thiệu thành phố.
7 activity: Danh sách các hoạt động của thành phố.
Do dữ liệu không phức tạp và không quá nhiều nên tôi đã sử dụng Python để làm sạch dữ liệu và đẩy vào trong Cassandra.
Cơ sở dữ liệu
Dữ liệu sau khi được xử lí sẽ được đưa vào trong Cassandra Lí do là vì:
• Khả năng mở rộng ngang: Cassandra được thiết kế để mở rộng dễ dàng bằng cách thêm nút vào hệ thống để xử lý lượng dữ liệu lớn và tải trọng cao Điều này phù hợp với bài toán của tôi khi cần xử lý hàng ngày khoảng 20.000 dòng dữ liệu mới.
• Hỗ trợ cụm nút: Cassandra cho phép tổ chức dữ liệu thành các cụm nút (node cluster) với mô hình phân tán Mỗi nút lưu trữ một phần dữ liệu và tạo thành một hệ thống phân tán, giúp tăng tính sẵn sàng và tin cậy của hệ thống.
• Hỗ trợ cấu trúc dữ liệu đa dạng: Cassandra cho phép lưu trữ dữ liệu có cấu trúc hoặc không có cấu trúc một cách linh hoạt Điều này rất hữu ích khi crawl dữ liệu từ các trang web có định dạng và cấu trúc khác nhau.
• Tính khả chuyển: Cassandra hỗ trợ mô hình mở rộng ngang tự động, cho phép tôi thêm nút và cụm nút một cách dễ dàng để tăng khả năng lưu trữ và xử lý dữ liệu khi số lượng người dùng và dữ liệu tăng lên.
• Hiệu suất cao: Cassandra được thiết kế để đạt hiệu suất cao và xử lý hàng triệu yêu cầu mỗi giây Nó hỗ trợ lưu trữ dữ liệu cột (columnar data storage) giúp truy xuất dữ liệu nhanh chóng và hiệu quả.
• Hỗ trợ tương thích: Cassandra hỗ trợ nhiều ngôn ngữ lập trình và giao thức, cho phép tích hợp dễ dàng với các ứng dụng và hệ thống hiện có.
Cassandra lưu trữ dữ liệu theo mô hình cột (columnar data storage) Điều này có nghĩa là dữ liệu trong Cassandra được tổ chức thành các cột thay vì các hàng như trong các hệ thống cơ sở dữ liệu truyền thống Mỗi cột chứa một giá trị dữ liệu cụ thể và có thể lưu trữ các loại dữ liệu khác nhau.
Cassandra tổ chức dữ liệu thành các bảng (tables), và mỗi bảng có các cột (columns) Mỗi hàng (row) trong bảng chứa các giá trị tương ứng với từng cột.
Mỗi hàng được xác định bằng một khóa duy nhất (primary key), và các bảng có thể có nhiều cột tùy ý.
Dữ liệu trong Cassandra được lưu trữ dưới dạng phân tán, tức là nó được chia thành nhiều phần và lưu trữ trên nhiều nút trong cụm Mỗi phần dữ liệu được lưu trữ trên một nút dựa trên giá trị khóa của nó Khi thêm nút mới vào cụm hoặc thay đổi cấu trúc dữ liệu, Cassandra tự động phân phối và cân bằng lại dữ liệu để đảm bảo tính mở rộng và hiệu suất cao.
Mô hình cột của Cassandra giúp cải thiện hiệu suất truy vấn và tăng tính mở rộng của hệ thống Nó cho phép lưu trữ dữ liệu có cấu trúc và không có cấu trúc một cách hiệu quả và linh hoạt Đồng thời, việc phân tán dữ liệu trên nhiều nút giúp tăng tính sẵn sàng và tin cậy của hệ thống.
Trong dự án này, dữ liệu được làm sạch và đưa vào 3 bảng dưới đây:
Bảng dữ liệu city-location:
STT Tên trường Kiểu dữ liệu Mô tả Ràng buộc
1 id INT Mã số địa điểm PRIMARY
2 city_name TEXT Tên thành phố PRIMARY
3 country_id INT Mã số quốc gia
4 country_code TEXT Mã quốc gia
5 country_name TEXT Tên quốc gia
6 state_code TEXT Mã tiểu bang/tỉnh
7 type TEXT Loại địa điểm
Bảng dữ liệu city-intro:
STT Tên trường Kiểu dữ liệu Mô tả Ràng buộc
1 city_id TEXT Mã thành phố PRIMARY
2 city_name TEXT Tên thành phố
3 country_name TEXT Tên quốc gia
4 city_image TEXT URL hình ảnh thành phố
5 title TEXT Tiêu đề giới thiệu
6 intro TEXT Nội dung giới thiệu
7 activity LIST Danh sách các hoạt động
Bảng dữ liệu hotel-data:
STT Tên trường Kiểu dữ liệu Mô tả Ràng buộc
1 hotel_url TEXT URL khách sạn PRIMARY
2 hotel_name TEXT Tên khách sạn
3 total_hotel_reviews INT Tổng số đánh giá của khách sạn
4 star FLOAT Điểm đánh giá của khách sạn
5 hotel_address TEXT Địa chỉ khách sạn
6 price INT Giá khách sạn
7 review_date DATE Ngày đánh giá
8 reviewer_rating INT Điểm đánh giá từ người đánh giá 9 reviewer_contribution INT Mức đóng góp của người đánh giá
10 reviewer_link TEXT URL của người đánh giá PRIMARY
KEY 11 reviewer_title_comment TEXT Tiêu đề đánh giá của người đánh giá
12 reviewer_comment TEXT Nội dung đánh giá của người đánh giá 13 reviewer_stay_date DATE Ngày lưu trú của người đánh giá
14 reviewer_trip_type TEXT Loại chuyến đi của người đánh giá
15 sentiment_score FLOAT Điểm cảm xúc từ người đánh giá
16 city TEXT Tên thành phố
17 country TEXT Tên quốc gia
18 hotel_id TEXT Mã khách sạn
19 inserted_date TIMESTAMP Thời gian thêm dữ liệu PRIMARY
20 reviewer_nation TEXT Quốc tịch của người đánh giá
21 hotel_language TEXT Ngôn ngữ khách sạn sử dụng
Dữ liệu trong bảng hotel-data sẽ được thêm mới hằng ngày và khóa chính sẽ gồm3 trường là reviewer_link, inserted_date, hotel_url Lí do là do cách dữ liệu được thu thập Đầu tiên khi xử lý bằng Spark, sẽ có nhiều bản ghi có cùng inserted_date do được xử lý cùng lúc nên không thể 1 mình làm khóa chính Vì dữ liệu được lọc theo các khách sạn, và có thể xảy ra trường hợp nhiều khách du lịch cùng bình luận 1 lúc nên cần thêm trường hotel_url và reviewer_link Mỗi một bản ghi đầy đủ trong bảng này sẽ chứa bình luận của khách du lịch trên trang Tripadvisor, còn nếu không có bình luận thì sẽ để cập nhật giá của khách sạn tại ngày hôm đó.
Thiết kế website
Sau khi dữ liệu được chứa trong cơ sở dữ liệu, liên kết và tương tác với phần Backend là bước cần thiết để thực hiện các quá trình xử lý và phân tích Trong tình huống này, một phương tiện hữu ích và phổ biến để triển khai phần Backend là framework Flask trong môi trường lập trình Python.
Flask đã được thiết kế nhằm tối ưu hóa hiệu suất và đơn giản hóa quá trình xây dựng ứng dụng web Dựa vào nguyên tắc tập trung vào cơ bản, Flask mang đến một tập hợp các tính năng sáng tạo cho việc xử lý tác vụ phức tạp Trong trường hợp này, nó đáp ứng các nhu cầu của dự án thông qua cơ chế định tuyến mạnh mẽ, mô phỏng các mẫu giao diện, quản lý trạng thái phiên và hỗ trợ tích hợp giao thức RESTful API.
Các cơ chế định tuyến của Flask cho phép đưa ra các hành động xác định cho các đường dẫn cụ thể, tạo điều kiện thuận lợi cho việc điều hướng và xử lý các yêu cầu từ người dùng Việc quản lý trạng thái phiên thông qua Flask giúp duy trì thông tin trạng thái giữa các yêu cầu, đặc biệt quan trọng đối với các ứng dụng đòi hỏi xác thực và phiên làm việc dài hạn.
Hơn nữa, khả năng hỗ trợ giao thức RESTful API cho phép tích hợp dễ dàng với các ứng dụng và dịch vụ bên ngoài, đảm bảo mở rộng và tích hợp linh hoạt cho ứng dụng web.
Với những lợi ích vượt trội mà Flask mang lại, nó trở thành một phương tiện hữu ích và hiệu quả trong việc giảm thiểu thời gian công sức của tôi trong việc phát triển ứng dụng web Dưới đây là kiến trúc của Backend:
Hình 3.8: Kiến trúc phân lớp của hệ thống
Backend được thiết kế theo mô hình 3 lớp gồm:
• Lớp Presentation Layer: Lớp này đảm nhận việc xử lý các yêu cầu từ người dùng và trả về các phản hồi phù hợp Trong dự án này, Presentation Layer được xây dựng bằng Flask để xử lý các yêu cầu từ frontend và trả về các dữ liệu theo định dạng RESTful API.
• Lớp Business Layer: Lớp này chịu trách nhiệm xử lý logic của ứng dụng Nó tương tác với các lớp dữ liệu để lấy thông tin, xử lý và trả về kết quả cho
• Lớp Data Layer: Lớp này làm việc với cơ sở dữ liệu để lấy và lưu trữ dữ liệu.
Trong dự án này, dữ liệu được lấy từ Cassandra thông qua các câu truy vấn, sau đó được xử lý và trả về cho Business Layer.
Giao diện chính là bộ mặt của ứng dụng bởi đây là thành phần giao tiếp trực tiếp với người sử dụng Cần tạo ra trải nghiệm toàn diện hơn, giao diện của ứng dụng hướng tới hỗ trợ nhiều kích cỡ màn hình khác nhau như màn hình laptop, màn hình máy tính bảng, màn hình điện thoại Vì vậy React là một lựa chọn phù hợp để làm giao diện cho dự án của tôi, đặc biệt là khi tôi cần tích hợp các biểu đồ phức tạp và tương tác với trang web Có một số lí do quan trọng cho việc chọn React:
• Thư viện biểu đồ phong phú: React có nhiều thư viện biểu đồ mạnh mẽ và đa dạng như Recharts, Chart.js, và Victory, giúp tôi dễ dàng hiển thị các biểu đồ đường, biểu đồ cột, biểu đồ hình tròn và các biểu đồ phức tạp khác.
• Quản lý trạng thái dễ dàng: React hỗ trợ quản lý trạng thái ứng dụng một cách linh hoạt qua các state và props, giúp tôi cập nhật giao diện khi dữ liệu thay đổi mà không cần phải làm lại hoặc làm tốn công sức.
• Tích hợp mượt mà với công nghệ: React cho phép tôi dễ dàng tích hợp các thư viện biểu đồ và công nghệ khác vào trang web của mình Tôi có thể sử dụng các thư viện hỗ trợ biểu đồ như D3.js hoặc Chart.js và tích hợp chúng một cách mượt mà với giao diện React của tôi.
• Tương tác trực quan: React cho phép tôi tạo các giao diện tương tác mượt mà và trực quan, giúp người dùng tương tác với các biểu đồ và dữ liệu một cách dễ dàng và trực quan.
• Tối ưu hóa hiệu suất: React sử dụng Virtual DOM để tối ưu hiệu suất, giúp cập nhật giao diện nhanh chóng và giảm thiểu việc làm lại của trình duyệt, cải thiện trải nghiệm người dùng.
Tóm lại, React là một công nghệ phù hợp để xây dựng giao diện đa dạng và tương tác cho dự án của tôi Thư viện biểu đồ đa dạng, khả năng quản lý trạng thái dễ dàng, tích hợp mượt mà và khả năng tương tác trực quan của React giúp tôi xây dựng một giao diện tối ưu, thu hút và chất lượng cho người dùng của mình.
Trong dự án này, giao diện gồm có 3 trang:
• Home: Trang chủ chứa thanh tìm kiếm để người dùng nhập tên thành phố hoặc khách sạn vào Đồng thời trang này cũng gợi ý một số địa điểm nổi tiếng.
KẾT QUẢ THỰC NGHIỆM VÀ ĐÁNH GIÁ
Cấu hình máy
Hệ thống được triển khai trên laptop Hp pavilon gaming 15, CPU Ryzen 54600H, RAM 16GB Các node dùng để crawl dữ liệu là các docker container cóRAM 2GB, swap tối đa 4GB, số CPU là 2.
Giao diện website
Tìm kiếm thông tin thành phố
• Tại trang chủ đã hiển thị thanh tìm kiếm, nút tìm kiếm, các thành phố gợi ý như thiết kế Sau đó tiến hành nhập tên thành phố Bali vào ô tìm kiếm.
Hình 4.1: Giao diện trang chủ
• Sau đó website sẽ mở ra 1 trang mới cung cấp thông tin về thành phố Bali.
Hình 4.2: Giới thiệu thành phố
Phần đầu tiên cung cấp thông tin về thành phố Bali như đất nước, dân số, được mệnh danh, biết đến là gì.
Phần thứ 2 chứa nội dung giới thiệu về thành phố Bali đồng thời chứa thông tin gợi ý về các địa điểm nên ghé thăm và các khách sạn tốt nhất được đề xuất.
Hình 4.4: Thống kê về khách sạn
Phần phía trên chứa 3 biểu đồ thống kê về các loại hình du lịch của du khách, mức độ hài lòng và biến động giá cả Thống kê được dựa trên số lượng đánh giá là khoảng 220.
Hình 4.5: Thống kê về thời tiết
Cuối cùng là dữ liệu thống kê về nhiệt độ và lượng mưa tại thành phố này kể từ năm 2020 đến nay Đây là thông tin quan trọng cần được quan tâm mỗi khi tới thăm 1 thành phố nào đó.
Tìm kiếm thông tin khách sạn
Tiếp theo là thực nghiệm với chức năng tìm kiếm thông tin khách sạn.
• Đầu tiên ta nhập vào tên khách sạn "La Siesta Premium Hang Be"
Hình 4.6: Tìm kiếm khách sạn
• Sau đó thì trang mới xuất hiện cung cấp thông tin về khách sạn này như sau:
Hình 4.7: Giới thiệu khách sạn
Phần đầu tiên chưa thông tin chung về khách sạn như thành phố, quốc gia, địa chỉ của khách sạn này.
Hình 4.8: Thống kê giá khách sạn
Phần thứ 2 cho thấy số lượng comment đã thu thập được của khách du lịch về khách sạn này, số sao trung bình và đóng góp trung bình của các du khách Từ những thông tin thu thập được tôi đã tạo ra 1 biểu đồ thống kê biến động giá phòng theo thời gian.
Hình 4.9: Thống kê bình luận
Phần thứ 3 thể hiện thống kê chung về mức độ hài lòng của du khách tại khách sạn này và chi tiết các phần tiêu đề đánh giá của du khách Lí do vì phần đánh giá có thể rất dài nên không phù hợp để hiển thị và tiêu đề đã bao quát hết nội dung đánh giá.
Hình 4.10: Thống kê quốc gia
Cuối cùng là 2 biểu đồ thống kê về quốc tịch của các khách đã đến khách sạn này và mục đích chuyến đi của họ là gì Đây là cơ sở tham khảo quan trọng không chỉ cho người có nhu cầu du lịch mà còn cho các đơn vị lữ hành, dịch vụ khách sạn.
Sau đây là tổng hợp lại các test case đã thực hiện:
STT Test Case Dữ liệu đầu vào
Kết quả đạt được Trạng thái
Tên thành phố Tìm kiếm thành công và mở ra trang thông tin về thành phố Đạt
Tên khách sạn Tìm kiếm thành công và mở ra trang thông tin về khách sạn Đạt
3 Nhập sai tên thành phố hoặc khách sạn
Tên sai bất kỳ Thông báo không tìm thấy Đạt
Bảng 4.1: Bảng kết quả test case tìm kiếm
STT Test Case Dữ liệu đầu vào
Kết quả đạt được Trạng thái
Tên thành phố từ trang chủ
Hiển thị thông tin thành phố và các biểu đồ liên quan Đạt
Bảng 4.2: Bảng kết quả test case thông tin thành phố
STT Test Case Dữ liệu đầu vào
Kết quả đạt được Trạng thái
Tên khách sạn từ trang chủ
Hiển thị thông tin khách sạn và các biểu đồ liên quan Đạt
Bảng 4.3: Bảng kết quả test case thông tin khách sạn
Crawl dữ liệu
Hình 4.11: Tốc độ xử lý
Kết quả trên được lấy ra từ thống kê của 1 crawler khi thực hiện việc thu thập dữ liệu Từ kết quả trên có thể thấy dữ liệu từ 1718 URL được lấy thành công trong vòng 16826 giây, tốc độ khoảng gần 10 giây cho 1 URL Sở dĩ như vậy là vì cần đợi trang web load xong và chờ click vào các phần bình luận bị thu gọn Với cụm crawl gồm 3 node như của hệ thống, 1 ngày sẽ crawl dữ liệu của khoảng 20000 URL khách sạn.
Dưới đây là bảng thống kê số lượng URL lấy được với các node:
STT Số node Thời gian crawl Số khách sạn thu thập được
Bảng 4.4: Bảng kết quả test case crawl dữ liệu
Dựa vào bảng trên có thể thấy lượng dữ liệu thu thập được của các khách sạn tăng lên theo số lượng node trong cụm crawl và thời gian crawl Tuy nhiên sẽ không tăng tuyến tính do vấn đề là trong hệ thống này các node đều truy cập chung 1 mạng nên sẽ tốc độ mạng mỗi node sẽ giảm đi khi tăng số node lên Đồng thời khi tăng thời gian thu thập thì hệ thống cũng không tăng tuyến tính do càng thu thập lâu thì phần cứng hệ thống sẽ bị chiếm tài nguyên nhiều hơn ảnh hưởng đến tốc độ thu thập.
Xử lí dữ liệu
Hệ thống xử lý dữ liệu gồm 2 node Spark chạy chế độ standalone được triển khai trên Docker.
Dưới đây là cấu hình của 2 node:
Hình 4.12: Cấu hình cụm spark
Tiếp theo tiến hành xử lý với dữ liệu test khoảng 11000 dòng:
Dữ liệu nạp vào khoảng 11000 dòng có kích thước khoảng 7.8MB Kết quả thực thi như sau:
Hình 4.14: Kết quả xử lý 11000 dòng
Tiếp theo để kiểm tra với dữ liệu lớn hơn khoảng 100 lần tức là 1100000 dòng.
Kết quả thực thi như sau:
Hình 4.15: Kết quả xử lý 1100000 dòng
Với dữ liệu thu thập thực tế hiện tại của hệ thống khoảng 20000 bản ghi mỗi ngày, cụm spark gồm 2 node chạy chế độ standalone sẽ thực thi dưới 1 phút Trong trường hợp dữ liệu có thể tăng đột biến nhiều lần hệ thống vẫn có thể đáp ứng hoàn toàn.
Đánh giá
Tôi đã so sánh trực tiếp với dữ liệu hiển thị trên website Tripadvisor.com của khoảng 100 thành phố và khách sạn thì nhận thấy dữ liệu thu thập được hoàn toàn chính xác.
Theo như một khảo sát nhỏ khoảng 15 người biết tiếng Anh cơ bản của tôi thì họ đã thao tác thành công và đánh giá là rất đơn giản trên trang web này Thông tin trên các biểu đồ cũng rất dễ hiểu và nắm bắt.
Tuy nhiên hệ thống trên đây chỉ phù hợp với môi trường phát triển, trong thực tế cần tăng thêm số lượng các node và cấu hình của hệ thống để đảm bảo hiệu năng và tính toàn vẹn của dữ liệu.
Tóm lại hệ thống đã chứng minh hiệu quả và đáng tin cậy trong việc xử lý và quản lý lượng dữ liệu lớn đến từ ít nhất 20,000 khách sạn mỗi ngày cùng với dữ liệu của hàng ngàn thành phố trên thế giới Bằng cách sử dụng các công nghệ nhưScrapy và Selenium để crawl dữ liệu, Apache Kafka và Apache Spark để xử lý dữ liệu lớn, và Cassandra để lưu trữ dữ liệu, hệ thống đã cho thấy khả năng mở rộng và chịu lỗi tốt.