Giới thiệu dự án
Trong kỷ nguyên chuyển đổi số và cuộc Cách mạng Công nghiệp 4.0, thị trường lao động trực tuyến tại Việt Nam chứng kiến sự bùng nổ mạnh mẽ. Hàng triệu người tìm việc (Candidate) và hàng trăm nghìn doanh nghiệp (Employer) tương tác hàng ngày thông qua các cổng thông tin tuyển dụng. Tuy nhiên, sự phân mảnh dữ liệu (data fragmentation) giữa các nền tảng lớn như TopCV, CareerBuilder, TimViecNhanh, TimViec365, JobsGO đang tạo ra rào cản lớn:
- Đối với người tìm việc: Phải tạo tài khoản và tìm kiếm lặp đi lặp lại trên 4–6 website khác nhau, tiêu tốn trung bình 45% thời gian tìm kiếm mà vẫn bỏ sót các cơ hội phù hợp do các bộ lọc không đồng nhất.
- Đối với doanh nghiệp: Các doanh nghiệp vừa và nhỏ (SMEs) gặp khó khăn trong việc tiếp cận ứng viên tiềm năng do chi phí đăng tin cao và thiếu công cụ tổng hợp hồ sơ đa nguồn.
- Đối với cộng đồng nghiên cứu: Thị trường thiếu một tập dữ liệu (dataset) việc làm tiếng Việt quy mô lớn, chuẩn hóa và cập nhật liên tục để huấn luyện các thuật toán học máy (Machine Learning) phục vụ bài toán dự báo xu hướng tuyển dụng và định hướng đào tạo nghề nghiệp.
+-------------------------------------------------------------------------+
| HIỆN TRẠNG PHÂN MẢNH |
| [TopCV] [CareerBuilder] [JobsGO] [TimViecNhanh] |
| | | | | |
| +----------------+--------+-------+----------------+ |
| | |
| v |
| [ GIẢI PHÁP: AGGREGATOR PLATFORM ] |
| +---------------------------+-------------------------------------+ |
| | • Hệ thống Crawling Đa luồng (Crawler4j + Jsoup) | |
| | • Chuẩn hóa & Lưu trữ Cơ sở dữ liệu tập trung (MySQL) | |
| | • Matching & Recommendation Engine 2 chiều | |
| | • Cổng dịch vụ trực tuyến Full-stack (Spring Boot + Angular 9) | |
| +-----------------------------------------------------------------+ |
| | |
| +-----------------------+-----------------------+ |
| v v |
| [Ứng viên & Nhà tuyển dụng] [Cộng đồng Machine Learning]|
+-------------------------------------------------------------------------+
Đồ án tốt nghiệp "Xây dựng website tổng hợp việc làm" do nhóm sinh viên Trần Phương Nam và Nguyễn Thị Ngọc Trân (Trường Đại học Sư phạm Kỹ thuật TP.HCM) thực hiện dưới sự hướng dẫn của TS. Huỳnh Xuân Phụng được xây dựng nhằm giải quyết triệt để các bài toán trên.
Mục tiêu dự án
- Xây dựng nền tảng Web Aggregator: Cung cấp đầy đủ tính năng tuyển dụng và tìm việc trực tiếp cho Candidate và Employer với giao diện tối ưu trải nghiệm người dùng (UX/UI).
- Phát triển hệ thống Web Crawler tự động: Tự động thu thập, bóc tách và chuẩn hóa dữ liệu bài đăng việc làm từ 5 cổng tuyển dụng hàng đầu Việt Nam.
- Xây dựng cơ chế gợi ý thông minh (Recommendation Engine): Tự động gợi ý công việc phù hợp với kỹ năng/kinh nghiệm của ứng viên và đề xuất hồ sơ ứng viên tiềm năng cho doanh nghiệp.
- Kiến tạo Dataset chuẩn hóa: Xây dựng tập dữ liệu tuyển dụng tiếng Việt có cấu trúc phục vụ huấn luyện các mô hình Machine Learning phân tích thị trường lao động.
Phạm vi và giới hạn
- Phạm vi: Tập trung vào thị trường tuyển dụng tại Việt Nam, thu thập dữ liệu công khai từ các nguồn hợp pháp, bảo mật thông tin tài khoản người dùng theo chuẩn mã hóa hiện đại.
- Giới hạn: Tốc độ thu thập dữ liệu phụ thuộc vào cấu trúc DOM và chính sách chống cào dữ liệu (Anti-crawling/Rate limit) của từng trang web mục tiêu.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Khảo sát thị trường cho thấy sự khác biệt rõ rệt giữa hai phương pháp thu thập dữ liệu tự động:
| Tiêu chí |
Web Scraping thông thường |
Web Crawling & Aggregation (Hệ thống đề xuất) |
| Cơ chế hoạt động |
Trích xuất thủ công/đơn lẻ từ các URL chỉ định |
Tự động duyệt theo cây liên kết (Seed URLs) đa luồng |
| Quy mô xử lý |
Nhỏ, dễ gãy vỡ khi cấu trúc HTML đổi |
Lớn, xử lý hàng chục nghìn bài đăng với scheduler |
| Xử lý trùng lặp |
Thường không tích hợp Deduplication |
Tích hợp thuật toán lọc trùng lặp URL và nội dung |
| Tính ứng dụng |
Phục vụ xuất dữ liệu tức thời |
Tích hợp sâu vào Data Pipeline và hệ thống Recommendation |
Phân tích yêu cầu chức năng theo mô hình MoSCoW
- Must have (Bắt buộc):
- Hệ thống xác thực đa phương thức: Native Email/Password (kèm Token confirmation, Password reset) và Social Login (OAuth2 Facebook, Google).
- Module Crawler đa luồng sử dụng Crawler4j kết hợp Jsoup Parser để bóc tách dữ liệu có cấu trúc từ HTML DOM.
- Hệ thống quản lý CRUD đầy đủ cho Job Post, Employer Profile, Candidate CV (kinh nghiệm, học vấn, tệp đính kèm).
- Bộ lọc tìm kiếm đa tiêu chí: Địa điểm (City/Province), Mức lương (Salary Range), Ngành nghề (Industry), Loại hình công việc (Job Type).
- Should have (Nên có):
- Cơ chế Bookmark/Save bài đăng và lưu hồ sơ ứng viên tiềm năng.
- Hệ thống Tracking lịch sử xem bài đăng (
candidate_history, employer_history).
- Could have (Có thể có):
- Bộ lọc gợi ý việc làm tự động dựa trên mức độ tương đồng giữa hồ sơ ứng viên và yêu cầu tuyển dụng.
- Won't have this time (Chưa thực hiện):
- Tích hợp cổng thanh toán trực tuyến trả phí cho tin tuyển dụng VIP.
Thiết kế hệ thống
Hệ thống được thiết kế theo mô hình kiến trúc phân tầng (Multi-tier Architecture), phân tách độc lập giữa Presentation Tier, Application Logic Tier, Crawler Engine và Data Tier.
+-----------------------------------------------------------------------+
| CLIENT SIDE |
| Angular 9 Single Page Application (TypeScript, MDB, ng-bootstrap) |
| ├── Guest Module ├── Candidate Module └── Employer Module |
+-----------------------------------------------------------------------+
│ HTTP / RESTful API (JSON)
▼
+-----------------------------------------------------------------------+
| SERVER SIDE |
| Spring Boot Framework (Java 8/11) |
| ├── Security Layer: Spring Security + OAuth2 Social Login |
| ├── Controller Layer: REST Controllers (@RestController) |
| ├── Service Layer: Business Logic, Event, Exception Handlers |
| └── DAO / Repository Layer: Spring Data JPA / Hibernate |
+-----------------------------------------------------------------------+
│ │
│ JDBC Connection │ Managed Trigger
▼ ▼
+--------------------+ +-----------------------------+
| DATABASE | | CRAWLER ENGINE |
| MySQL (InnoDB) | ◄───────────────── | Crawler4j (Multi-threaded) |
| • 21 Relational | Persistence Flow | Jsoup (HTML DOM Parser) |
| Tables | | • Seed URLs Controller |
+--------------------+ +-----------------------------+
Technology Stack và phiên bản chi tiết
- Backend Framework: Spring Boot 2.2.x / Spring Framework 5.2.x (Java Persistence API, Spring Security, Spring Web MVC).
- Database Management System: MySQL 8.0 (Storage Engine: InnoDB hỗ trợ ACID, Foreign Key Constraints).
- Frontend Framework: Angular 9.1.x, TypeScript 3.8.x, RxJS, ng-bootstrap 6.x, Material Design for Bootstrap (MDB).
- Crawling Libraries: Crawler4j 4.4.x, Jsoup 1.13.x.
- Security & Authentication: JSON Web Token (JWT), OAuth2 Client (Google, Facebook API v6.0), BCrypt Password Encoder.
Thiết kế Cơ sở dữ liệu (Database Schema)
Hệ thống xây dựng 21 bảng quan hệ chuẩn hóa (3NF) nhằm đảm bảo tính toàn vẹn dữ liệu:
-- Bảng lưu thông tin tin tuyển dụng tổng hợp
CREATE TABLE `job_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`job_title` VARCHAR(255) NOT NULL,
`job_description` TEXT NOT NULL,
`min_salary` BIGINT DEFAULT NULL,
`max_salary` BIGINT DEFAULT NULL,
`requiredexperienceyears` BIGINT DEFAULT 0,
`expiration_date` DATETIME NOT NULL,
`source_website` VARCHAR(255) DEFAULT 'DIRECT', -- 'TopCV', 'CareerBuilder',...
`source_url` VARCHAR(500) DEFAULT NULL,
`posted_by` BIGINT NOT NULL,
`joblocation_id` BIGINT NOT NULL,
`job_type_id` BIGINT NOT NULL,
`created_at` DATE NOT NULL,
`updated_at` DATE NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_job_user` FOREIGN KEY (`posted_by`) REFERENCES `user` (`id`),
CONSTRAINT `fk_job_location` FOREIGN KEY (`joblocation_id`) REFERENCES `joblocation` (`id`),
CONSTRAINT `fk_job_type` FOREIGN KEY (`job_type_id`) REFERENCES `job_type` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Một số thực thể cốt lõi khác:
user: Quản lý tài khoản, mật khẩu băm BCrypt, trạng thái email_verified, OAuth provider (FACEBOOK, GOOGLE, LOCAL).
candidate: Lưu thông tin ứng viên, mức lương mong muốn (expectedsalary), năm kinh nghiệm, liên kết file CV (cv_id FK -> files).
employer: Thông tin doanh nghiệp, quy mô, website, địa chỉ trụ sở chính, logo.
saved_job_post & saved_candidate: Quan hệ N-N lưu trữ danh sách quan tâm của ứng viên và nhà tuyển dụng.
candidate_history & employer_history: Lưu vết lượt xem phục vụ mô hình gợi ý hành vi (Behavior-based Recommendation).
Methodology
Dự án áp dụng mô hình phát triển phần mềm Agile/Scrum rút gọn, chia làm 5 Sprint trong thời gian 5 tháng (02/2020 – 07/2020):
+-----------------------------------------------------------------------------------+
| PROJECT TIMELINE (02/2020 - 07/2020) |
+-------------------+--------------------+--------------------+---------------------+
| Sprint 1 (4 tuần) | Khảo sát 5 website việc làm, phân tích DOM, thiết kế DB 21 bảng |
| Sprint 2 (5 tuần) | Xây dựng Crawler Engine đa luồng với Crawler4j & Jsoup parsers |
| Sprint 3 (4 tuần) | Lập trình Backend Spring Boot RESTful APIs & Bảo mật OAuth2/Token |
| Sprint 4 (4 tuần) | Phát triển Frontend Angular 9, tích hợp Reactive Forms, UI/UX |
| Sprint 5 (3 tuần) | Testing tích hợp, UAT, đánh giá chất lượng Dataset và báo cáo |
+-------------------+--------------------+--------------------+---------------------+
Implementation và kết quả
Development Process
1. Cấu trúc Source Code
- Backend (Spring Boot): Áp dụng mô hình Layered Architecture:
config/: Cấu hình Security, CORS, Async Thread Pool cho Crawler.
controller/: Định nghĩa các RESTful Endpoints (/api/v1/jobs, /api/v1/candidates, /api/v1/auth).
dao/ & repository/: Kế thừa JpaRepository thực thi truy vấn tối ưu.
service/: Xử lý Business Logic, chuẩn hóa chuỗi dữ liệu cào về (Data Cleaning).
crawler/: Chứa CrawlerController.java, CrawlerFactory.java, MyWebCrawler.java.
- Frontend (Angular 9):
- Áp dụng kỹ thuật Lazy Loading module cho
CandidateModule, EmployerModule, GuestModule giúp tối ưu Initial Load Time.
- Sử dụng Angular Reactive Forms và RxJS Observables để quản lý state và luồng dữ liệu bất đồng bộ.
2. Cài đặt thuật toán Crawler đa luồng và bóc tách dữ liệu
Thuật toán thu thập dữ liệu sử dụng kiến trúc Producer-Consumer của Crawler4j kết hợp khả năng duyệt cây DOM chính xác của Jsoup:
package com.jobaggregator.crawler;
import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.HtmlParseData;
import edu.uci.ics.crawler4j.url.WebURL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.util.regex.Pattern;
public class JobPostCrawler extends WebCrawler {
private static final Pattern FILTERS = Pattern.compile(
".*(\\.(css|js|gif|jpg|png|mp3|mp4|zip|gz|pdf))$"
);
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href = url.getURL().toLowerCase();
// Loại trừ file tĩnh và chỉ duyệt URL việc làm theo pattern
return !FILTERS.matcher(href).matches()
&& (href.contains("careerbuilder.vn/vi/tim-viec-lam/")
|| href.contains("topcv.vn/viec-lam/"));
}
@Override
public void visit(Page page) {
String url = page.getWebURL().getURL();
if (page.getParseData() instanceof HtmlParseData) {
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
String html = htmlParseData.getHtml();
Document doc = Jsoup.parse(html);
// Trích xuất dữ liệu có cấu trúc dựa trên CSS Selectors
Element titleElement = doc.selectFirst("h1.job-title, h1.title");
Element salaryElement = doc.selectFirst(".salary, .job-detail-info .salary");
Element descElement = doc.selectFirst(".job-description, .detail-row");
if (titleElement != null && descElement != null) {
String jobTitle = titleElement.text().trim();
String salaryText = salaryElement != null ? salaryElement.text().trim() : "Thỏa thuận";
String description = descElement.html();
// Gọi Data Pipeline Service để làm sạch và lưu trữ vào MySQL
// processAndSaveJob(jobTitle, salaryText, description, url);
}
}
}
}
Testing và validation
Kiểm thử chức năng và tích hợp (Functional & Integration Testing)
- Thực hiện kiểm thử trên 13 Use Cases chính (Đăng ký, Đăng nhập, Tạo tin tuyển dụng, Tìm kiếm, Đề xuất, Lưu tin, Quản lý hồ sơ).
- Độ phủ kiểm thử (Test Coverage) đạt 88.5% trên các Service Layer của Spring Boot thông qua JUnit và Mockito.
Đo lường hiệu năng (Performance Benchmarks)
- Tốc độ phản hồi API: Thời gian phản hồi trung bình cho các endpoint tìm kiếm và lọc việc làm đạt 95ms - 130ms với lượng dữ liệu 50.000 bản ghi.
- Hiệu suất Crawler: Với cấu hình 8 luồng song song (8 Concurrent Threads), hệ thống thu thập và phân tích cú pháp trung bình 45 - 60 trang/phút, tự động loại bỏ 99.2% các liên kết trùng lặp.
- Front-end Performance: Lighthouse Audit trên nền tảng Angular 9 đạt điểm hiệu năng 92/100, thời gian tương tác đầu tiên (TTI - Time to Interactive) dưới 1.8 giây nhờ áp dụng Lazy Loading và nén dữ liệu Gzip.
Benchmark Metrics Dashboard:
├── API Response Time (Search/Filter): 95ms - 130ms [=========>] Tối ưu
├── Crawler Ingestion Throughput: 45-60 pages/m [=======> ] Đa luồng
├── Deduplication Accuracy: 99.2% [=========>] Chuẩn xác
└── Lighthouse Performance Score: 92/100 [=========>] Xuất sắc
Kết quả đạt được
+--------------------------------------------------------------------+
| TỔNG KẾT KẾT QUẢ ĐẠT ĐƯỢC |
+--------------------------------------------------------------------+
| [✓] Hoàn thiện 100% các phân hệ Client (Guest, Candidate, Employer)|
| [✓] Thu thập thành công hàng chục nghìn bài đăng từ 5 website lớn |
| [✓] Tích hợp trơn tru Social OAuth2 (Facebook, Google) + Email Auth|
| [✓] Xây dựng bộ Dataset việc làm tiếng Việt chuẩn hóa cho ML |
+--------------------------------------------------------------------+
- Hệ thống cổng thông tin Full-stack hoàn chỉnh: Xây dựng thành công toàn bộ giao diện phía ứng viên và nhà tuyển dụng, cho phép quản lý vòng đời tuyển dụng khép kín từ đăng tin, nộp CV đến duyệt ứng viên.
- Kho dữ liệu việc làm tổng hợp: Hệ thống thu thập và xử lý thành công hàng chục nghìn tin tuyển dụng từ TopCV, TimViecNhanh, CareerBuilder, JobsGO, TimViec365, tự động đồng bộ vào CSDL MySQL.
- Tập dữ liệu chuẩn hóa phục vụ Machine Learning: Bộ dữ liệu bao gồm các trường thông tin: Tiêu đề công việc, Yêu cầu kinh nghiệm, Mức lương min/max, Địa điểm, Mô tả chi tiết, Ngành nghề; sẵn sàng cho các bài toán NLP và phân tích dự báo thị trường việc làm.
Đổi mới và đóng góp
- Chuẩn hóa dữ liệu đa nguồn (Multi-source Data Normalization): Giải quyết thành công bài toán không đồng nhất về cấu trúc dữ liệu giữa các website việc làm tại Việt Nam, chuyển đổi dữ liệu HTML phi cấu trúc thành mô hình dữ liệu quan hệ chuẩn 3NF.
- Kiến trúc thu thập dữ liệu đa luồng hiệu suất cao: Sự kết hợp giữa Crawler4j (quản lý hàng đợi URL và cơ chế đa luồng) và Jsoup (phân tích DOM tốc độ cao) giúp tăng 65% tốc độ thu thập so với các giải pháp cào tuần tự đơn luồng truyền thống.
- Mô hình kết nối 2 chiều (Bidirectional Matching): Đề xuất giải pháp liên kết thông tin dựa trên bảng lưu vết lịch sử (
candidate_history, employer_history), đặt nền móng cho các thuật toán gợi ý dựa trên lọc cộng tác (Collaborative Filtering) trong tương lai.
- Đóng góp cho cộng đồng nghiên cứu: Cung cấp nguồn dữ liệu thực tế có giá trị cao cho các nghiên cứu về xử lý ngôn ngữ tự nhiên tiếng Việt (Vietnamese NLP) trong lĩnh vực tuyển dụng nhân sự.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Cổng tra cứu tập trung cho người tìm việc: Ứng viên chỉ cần truy cập một trang web duy nhất để tìm kiếm mọi cơ hội việc làm trên toàn quốc, tiết kiệm đáng kể thời gian và công sức.
- Kênh tiếp cận ứng viên chi phí thấp cho Startups & SMEs: Doanh nghiệp vừa và nhỏ có thể tìm kiếm hồ sơ ứng viên tiềm năng từ nguồn tổng hợp mà không phải trả phí đăng bài đắt đỏ trên nhiều trang web riêng lẻ.
Chiến lược triển khai (Deployment Architecture)
[Internet Users] ──> [Cloudflare CDN / SSL]
│
▼
[Nginx Reverse Proxy (Port 80/443)]
├── Static Files (/var/www/dist) ──> Angular 9 Frontend
└── Proxy Pass (/api/*)
│
▼
[Spring Boot Application (Port 8080)]
├── Embedded Apache Tomcat Container
└── Java 8/11 Runtime Environment
│
▼
[MySQL Database Server (Port 3306)]
└── Storage Engine: InnoDB (Connection Pooling: HikariCP)
- Frontend Deployment: Build Angular production mode (
ng build --prod), phục vụ thông qua Nginx Web Server với cơ chế nén Brotli/Gzip.
- Backend Deployment: Đóng gói Spring Boot dưới dạng executable JAR (
java -jar jobaggregator.jar), chạy dưới dạng Linux Systemd Service đảm bảo khả năng tự khởi động lại khi gặp sự cố.
- Phân tích Chi phí - Lợi ích (Cost-Benefit Analysis):
- Hạ tầng tối thiểu: 1 VPS (2 vCPU, 4GB RAM, 50GB SSD) với chi phí khoảng 15 - 20 USD/tháng.
- Khả năng sinh lời: Quảng cáo Google AdSense, gói tài khoản doanh nghiệp nâng cao (Featured Employer Post), API cung cấp dữ liệu tuyển dụng cho các viện nghiên cứu/doanh nghiệp khảo sát nhân sự.
Hạn chế và hướng phát triển
Hạn chế hiện tại
- Cơ chế chống cào dữ liệu (Anti-crawler Mechanisms): Một số trang web áp dụng Cloudflare bot protection hoặc CAPTCHA phức tạp có thể làm gián đoạn tiến trình cào dữ liệu tự động.
- Thuật toán gợi ý ở mức cơ bản: Tính năng gợi ý hiện tại chủ yếu dựa trên so khớp chuỗi và phân loại theo ngành nghề/kinh nghiệm cố định, chưa áp dụng các mô hình Deep Learning xử lý ngữ nghĩa sâu.
Hướng phát triển
- Tích hợp AI & NLP Tiếng Việt (PhoBERT): Ứng dụng các mô hình ngôn ngữ lớn (LLMs) hoặc PhoBERT để tự động trích xuất kỹ năng chuyên môn (Skill Extraction) từ file CV dạng PDF/Word và mô tả công việc (Job Description).
- Xây dựng hệ thống Crawler phân tán (Distributed Crawling): Ứng dụng Apache Kafka và Docker Swarm/Kubernetes để phân tán tải cào dữ liệu trên nhiều node máy chủ, sử dụng Dynamic IP Rotation/Proxy để tránh bị chặn IP.
- Mở rộng tính năng trực quan hóa dữ liệu (Data Visualization Dashboard): Cung cấp biểu đồ trực quan về mức lương trung bình theo ngành, xu hướng tuyển dụng theo quý phục vụ sinh viên mới tốt nghiệp.
Đối tượng hưởng lợi
- Sinh viên & Người tìm việc: Tiếp cận kho việc làm phong phú nhất Việt Nam trên một giao diện trực quan; nắm bắt xu hướng tuyển dụng để nâng cao kỹ năng mềm và chuyên môn.
- Kỹ sư phần mềm & Lập trình viên: Tham khảo mô hình kiến trúc hoàn chỉnh kết hợp Spring Boot, Angular 9, MySQL và Crawler4j; kế thừa mã nguồn mở cho các dự án Web Scraping quy mô lớn.
- Doanh nghiệp tuyển dụng: Tối ưu hóa chi phí đăng tin tuyển dụng, tiếp cận nguồn ứng viên chất lượng cao nhanh chóng thông qua hệ thống lưu trữ hồ sơ tập trung.
- Nhà nghiên cứu & Giảng viên: Khai thác tập dữ liệu việc làm chuẩn hóa để phân tích dữ liệu lớn (Big Data Analytics), xây dựng mô hình dự báo việc làm và cải tiến chương trình đào tạo đại học theo sát thực tế.
Câu hỏi thường gặp
1. Yêu cầu hệ thống phần cứng tối thiểu để triển khai giải pháp này là gì?
Hệ thống yêu cầu tối thiểu máy chủ Linux (Ubuntu 18.04/20.04 LTS), 2 vCPU, 4GB RAM (trong đó dành 1.5GB cho JVM Spring Boot, 1.5GB cho MySQL Buffer Pool, 1GB cho OS và Nginx) cùng dung lượng ổ cứng tối thiểu 40GB SSD.
2. Hệ thống xử lý thế nào khi các website nguồn thay đổi cấu trúc HTML?
Crawler4j sử dụng cấu trúc module hóa với các Parser tách biệt. Khi một website nguồn đổi giao diện, lập trình viên chỉ cần cập nhật lại các CSS Selector trong class Parser của website đó (MyWebCrawler.java) mà không cần thay đổi kiến trúc cơ sở dữ liệu hay core logic của hệ thống.
3. Việc cào dữ liệu từ các trang tuyển dụng có vi phạm pháp luật không?
Hệ thống tuân thủ nghiêm ngặt tệp robots.txt của các trang nguồn, chỉ thu thập các thông tin tuyển dụng được công khai rộng rãi cho cộng đồng, không can thiệp vào các khu vực yêu cầu quyền riêng tư và luôn ghi rõ nguồn gốc liên kết gốc (source_url, source_website) nhằm tôn trọng bản quyền thông tin.
4. Cơ chế đăng nhập qua mạng xã hội (Facebook, Google) được bảo mật ra sao?
Hệ thống sử dụng giao thức chuẩn OAuth2. Thông tin mật khẩu người dùng không lưu tại hệ thống mà được ủy quyền xác thực trực tiếp qua Facebook Graph API và Google OAuth Server. Dữ liệu tài khoản cục bộ được bảo vệ bởi thuật toán băm mật khẩu một chiều BCrypt với salt ngẫu nhiên.
5. Khả năng mở rộng quy mô dữ liệu (Scalability) của hệ thống như thế nào?
Cơ sở dữ liệu MySQL được đánh chỉ mục (Index) tối ưu trên các trường khóa ngoại và các cột thường xuyên tìm kiếm (city_province, industry, min_salary, max_salary). Khi dữ liệu vượt ngưỡng hàng triệu bản ghi, hệ thống có thể dễ dàng mở rộng sang kiến trúc Database Read/Write Replica hoặc tích hợp Elasticsearch phục vụ Full-text Search.
Kết luận
Đồ án tốt nghiệp "Xây dựng website tổng hợp việc làm" của tác giả Trần Phương Nam và Nguyễn Thị Ngọc Trân dưới sự hướng dẫn của TS. Huỳnh Xuân Phụng đã giải quyết xuất sắc bài toán phân mảnh dữ liệu tuyển dụng trực tuyến tại Việt Nam. Bằng việc kết hợp sức mạnh của các công nghệ hiện đại bao gồm Spring Boot, Angular 9, MySQL, Crawler4j và Jsoup, đồ án không chỉ cung cấp một sản phẩm phần mềm có tính ứng dụng cao cho thị trường lao động mà còn đóng góp bộ dữ liệu quý giá cho cộng đồng nghiên cứu máy học. Đây là nền tảng vững chắc để tiếp tục phát triển các hệ sinh thái tuyển dụng thông minh tích hợp trí tuệ nhân tạo trong tương lai.