Để tự động hóa trình duyệt Google Chrome, Selenium là công cụ quan trọng, giúp tương tác với trang web một cách linh hoạt. Dưới đây là cách sử dụng Selenium để crawl dữ liệu trang web và tự động hóa trình duyệt Google Chrome.
Hướng Dẫn Crawl Dữ Liệu Trang Web Bằng Selenium
Cài Đặt Selenium
Trình Điều Khiển Web
Như đã nói trước đó, Selenium có thành phần chạy như một quy trình độc lập và thực hiện các hành động thay vì chương trình Java. Phần này gọi là Trình Điều Khiển Web và bạn cần tải nó xuống máy của mình.
Truy cập trang tải về để lấy phiên bản mới nhất của Selenium phù hợp với hệ điều hành của bạn (Windows, Linux hoặc macOS). Sau đó, giải nén file ZIP tới một vị trí thuận tiện, chẳng hạn như C:\WebDrivers\chromedriver.exe. Bạn sẽ cần sử dụng đường dẫn này trong chương trình Java của mình.
Module Java
Tiếp theo, bạn cần cấu hình các module Java cần thiết để sử dụng Selenium. Nếu bạn đang sử dụng Maven để xây dựng chương trình Java, thêm các phụ thuộc vào tệp POM.xml như sau:
Để chạy các process, tất cả các module yêu cầu phải được tải xuống và cài đặt trên máy tính của bạn.
Bắt đầu với Selenium
Bắt đầu với Selenium. Bước đầu tiên là tạo ChromeDriver:
WebDriver driver = new ChromeDriver();
Trên màn hình sẽ mở cửa sổ Google Chrome mới. Truy cập trang tìm kiếm của Google:
driver.get('http://www.google.com');
Xác định các ô nhập văn bản để thực hiện tìm kiếm. Ô văn bản có tên là q. Định vị các phần tử HTML trên trang bằng cách sử dụng phương thức WebDriver.findElement().
WebElement element = driver.findElement(By.name('q'));
Có thể gửi văn bản đến bất kỳ phần tử nào khác bằng phương thức sendKeys (). Thử gửi với một cụm từ tìm kiếm và kết thúc bằng một dòng mới để bắt đầu tìm kiếm ngay lập tức:
element.sendKeys('terminator\n');
Lúc này, quá trình tìm kiếm đang được thực hiện, bạn chỉ cần đợi cho trang kết quả. Để thực hiện điều này:
new WebDriverWait(driver, 10)
.until(d -> d.getTitle().toLowerCase().startsWith('terminator'));
Đoạn mã trên đơn giản là yêu cầu Selenium đợi 10 giây và quay lại khi tiêu đề của trang bắt đầu bằng terminator. Sử dụng hàm lambda để xác định điều kiện chờ.
Tại thời điểm này, bạn đã có được tiêu đề của trang.
System.out.println('Tiêu đề: ' + driver.getTitle());
Khi kết thúc phiên làm việc, đóng cửa sổ trình duyệt:
driver.quit();
Đây chỉ là một phiên bản đơn giản của cách kiểm soát trình duyệt bằng Java thông qua Selenium. Mặc dù đơn giản, nhưng nó mở ra khả năng tự động hóa nhiều công việc mà bạn thường phải thực hiện thủ công.
Sử dụng Google Chrome Inspector
Công cụ kiểm tra trang Google Chrome là một bảo bối quan trọng giúp xác định các phần tử cần tương tác với Selenium. Đây là công cụ không thể thiếu để nhắm đến phần tử chính xác và thực hiện các thao tác như click nút. Dưới đây là cách sử dụng Inspector.
Mở Google Chrome và điều hướng đến một trang mới, chẳng hạn như trang xếp hạng phim Justice League (2017) trên IMDB.
Click phải vào phần tóm tắt trailer và chọn Inspect trong menu xuất hiện.
Tại tab Elements, bạn sẽ thấy văn bản tóm tắt được đặt trong một div với lớp là summary_text.
Sử dụng CSS hoặc XPath
Selenium hỗ trợ lựa chọn các phần tử trang bằng CSS (CSS2). Ví dụ, để chọn văn bản tóm tắt từ trang IMDB, bạn có thể sử dụng:
WebElement summaryEl = driver.findElement(By.cssSelector('div.summary_text'));
Bạn cũng có thể sử dụng XPath để chọn các phần tử theo cách tương tự. Để chọn văn bản tóm tắt, bạn có thể viết:
WebElement summaryEl = driver.findElement(By.xpath('//div[@class='summary_text']'));
XPath và CSS có những đặc điểm tương đương, do đó bạn có thể chọn sử dụng một trong hai.
Đọc Email từ Google bằng Java
Dưới đây là một ví dụ phức tạp hơn: tìm và đọc email từ Google.
Bắt đầu Chrome Driver, mở trình duyệt và đợi cho đến khi trang Gmail được tải.
WebDriver driver = new ChromeDriver();
driver.get('https://gmail.com');
new WebDriverWait(driver, 10)
.until(d -> d.getTitle().toLowerCase().startsWith('gmail'));
Tiếp theo, định vị khung email (với ID nhận dạng) và nhập địa chỉ email. Click chọn nút Next, sau đó đợi trang nhập mật khẩu tải lên.
/* Gõ tên đăng nhập/email */
{
driver.findElement(By.cssSelector('#identifierId')).sendKeys(email);
driver.findElement(By.cssSelector('.RveJvd')).click();
}
new WebDriverWait(driver, 10)
.until(d -> ! d.findElements(By.xpath('//div[@id='password']')).isEmpty() );
Bây giờ, chúng ta nhập mật khẩu, click nút Next một lần nữa và đợi trang Gmail tải lên.
/* Nhập mật khẩu */
{
driver
.findElement(By.xpath('//div[@id='password']//input[@type='password']'))
.sendKeys(password);
driver.findElement(By.cssSelector('.RveJvd')).click();
}
new WebDriverWait(driver, 10)
.until(d -> ! d.findElements(By.xpath('//div[@class='Cp']')).isEmpty() );
Tìm nạp danh sách các hàng email và lặp lại mỗi mục.
Danh sách
.findElements(By.xpath('//div[@class='Cp']//table/tbody/tr'));
for (WebElement tr : hàng) {
}
Đối với mỗi mục nhập, tìm và trích xuất khung Thông tin Người gửi. Lưu ý rằng một số mục có thể chứa nhiều phần tử, phụ thuộc vào số lượng người tham gia trong cuộc trò chuyện.
{
/* Phần tử Người gửi */
System.out.println('Người gửi: ');
for (WebElement phanTu : tr
.findElements(By.xpath('.//div[@class='yW']/*'))) {
System.out.println(' ' +
phanTu.getAttribute('email') + ', ' +
phanTu.getAttribute('name') + ', ' +
phanTu.getText());
}
}
Tiếp theo, tìm kiếm và nạp đối tượng.
{
/* Chủ đề */
System.out.println('Chủ đề: ' + tr.findElement(By.xpath('.//div[@class='y6']')).getText());
}
Và thời gian ngày của tin nhắn.
{
/* Ngày/Giờ */
WebElement dt = tr.findElement(By.xpath('./td[8]/*'));
System.out.println('Ngày: ' + dt.getAttribute('title') + ', ' +
dt.getText());
}
Dưới đây là tổng số email trên trang.
System.out.println(rows.size() + ' thư.');
Sau khi hoàn tất, đóng cửa sổ trình duyệt.
driver.quit();
Ở đây là cách thu thập dữ liệu trang web bằng Selenium với Google Chrome. Sử dụng Google Chrome Inspector, bạn dễ dàng xác định CSS hoặc XPath để trích xuất hoặc tương tác với các phần tử.