CHƯƠNG 3. PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG
3.5 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 độ.
3.5.2 Cấu hình Selenium
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:
Hình 3.3:Selenium options
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=imagesEnabled=false’: 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.
3.5.3 Cấu hình Scrapy-Redis
Tiếp theo là cài đặt Scrapy-Redis trên các máy dùng để thu thập dữ liệu. Cụm crawl gồm 3 node sẽ lấy dữ liệu từ Redis, còn node thứ 4 dùng để thu thập URL từ trang web Tripadvisor.com và lưu vào Redis.
Đoạn mã dưới đây có chức năng cấu hình các thông số cho việc thu thập dữ liệu.
Tôi đã điều chỉnh cấu hình cho spider, bao gồm thay đổi DEFAULT REQUEST HEADERS để phù hợp với việc lấy URL từ Redis.
Hình 3.6:Cấu hình Scrapy-Redis
Đoạn mã cung cấp thông tin về việc cấu hình spider để lấy URL từ Redis, sử dụng Scheduler và DupeFilter để đảm bảo không thu thập các địa chỉ trùng lặp, và sử dụng Item Pipelines để xử lý dữ liệu thu thập được. Từ đây các node trong cụm crawl sẽ làm việc dưới sự đảm bảo của Redis, toàn bộ dữ liệu sẽ được đẩy vào trong Apache Kafka.
3.5.4 Crawl dữ liệu khách sạn
Sau khi hoàn thành việc cấu hình, tôi đã tiến hành thu thập dữ liệu từ các khách sạn thông qua các công cụ như Scrapy và Selenium. Dữ liệu thu thập bao gồm hai phần chính là thông tin về giá tiền và bình luận của người dùng về khách sạn đó.
Tuy nhiên, do giới hạn về thời gian và khả năng thu thập, hệ thống chỉ có thể lấy được những bình luận gần đây nhất, tức là bình luận từ ngày hôm trước ngày chạy hiện tại. Do các bình luận nếu ở tháng trước sẽ không thể xác định chính xác thời gian nên việc chỉ cập nhật những bình luận gần nhất với ngày viết đánh giá được ghi trên trang web là "Yesterday" sẽ được xử lý hiệu quả. Điều này có nghĩa là một
số khách sạn có thể không có dữ liệu về bình luận của khách du lịch, vì các bình luận này không nằm trong khoảng thời gian thu thập.
Trong trường hợp này, phần bình luận của những khách sạn không có dữ liệu sẽ được để trống. Điều này cần được lưu ý khi sử dụng và xem xét dữ liệu trong hệ thống.
Dữ liệu bị thiếu và đầy đủ có dạng như dưới đây:
Hình 3.7:Dữ liệu thô
3.5.5 Crawl dữ liệu về các thành phố
Do dữ liệu chung về các thành phố như hình ảnh, giới thiệu, quốc gia, các điểm đến không thay đổi liên tục, tôi đã không crawl chúng thường xuyên. Thay vào đó là 1 tuần 1 lần để giảm tải cho hệ thống và không cần sử dụng scrapy-redis.