Cách crawl dữ liệu trang web bằng Selenium
Tự động hóa Google Chrome liên quan đến việc sử dụng công cụ Selenium , là một thành phần phần mềm nằm giữa chương trình và trình duyệt của bạn. Dưới đây là cách ...
Tự động hóa Google Chrome liên quan đến việc sử dụng công cụ Selenium, là một thành phần phần mềm nằm giữa chương trình và trình duyệt của bạn. Dưới đây là cách crawl dữ liệu trang web bằng Selenium để tự động hóa Google Chrome.
Thiết lập Selenium
Web Driver
Như đã đề cập ở trên, Selenium bao gồm thành phần phần mềm chạy dưới dạng process riêng biệt, và thực hiện các hành động thay các chương trình java. Thành phần này được gọi là Web Driver và phải được tải xuống máy tính của bạn.
Truy cập tại đây để tải phiên bản Selenium mới nhất, phù hợp với hệ điều hành trên máy tính của bạn (Windows, Linux hoặc macOS). Giải nén file ZIP trong vị trí phù hợp, chẳng hạn như C:WebDriverschromedriver.exe. Bạn sẽ phải sử dụng vị trí này trong chương trình java.
Module Java
Bước tiếp theo là thiết lập các module java cần thiết để sử dụng Selenium. Giả sử 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 POM.xml:
Để 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.
Đầu tiên thiết lập 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ẽ hiển thị cửa sổ Google Chrome mới. Điều hướng đến trang tìm kiếm của Google:
driver.get("http://www.google.com");
Tham chiếu đến các yếu tố đầu vào văn bản để thực hiện tìm kiếm. Phần tử 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 (method) WebDriver.findElement().
WebElement element = driver.findElement(By.name("q"));
Bạn 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 bằng 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 ");
Lúc này việc tìm kiếm đang được tiếng hành, bạn chỉ cần chờ trang kết quả. Để làm được điều này:
new WebDriverWait(driver, 10)
.until(d -> d.getTitle().toLowerCase().startsWith("terminator"));
Về cơ bản đoạn code trên nói với Selenium chờ 10 giây và trở lại khi tiêu đề trang bắt đầu với terminator. Sử dụng hàm lambda để xác định điều kiện để chờ.
Lúc này bạn đã có được tiêu đề của trang.
System.out.println("Title: " + driver.getTitle());
Sau khi hoàn tất với phiên là việc, đóng cửa sổ trình duyệt lại:
driver.quit();
Folks là phiên trình duyệt đơn giản được kiểm soát bằng cách sử dụng java thông qua Selenium. Mặc dù khá đơn giản nhưng nó cho phép bạn lập trình rất nhiều thứ mà bạn thường phải làm bằng tay.
Sử dụng Google Chrome Inspector
Google Chrome Inspector là công cụ vô giá để xác định các phần tử được sử dụng với Selenium. Công cụ này cho phép bạn nhắm đến các phần tử chính xác từ java để trích xuất thông tin cũng như để thực hiện các hành động tương tác như click vào 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, giả sử trang IMDB xếp hạng phim Justice League (2017).
Kích chuột phải vào phần tóm tắt trailer, chọn Inspect trên menu.
Từ tab Elements, bạn có thẻ thấy văn bản tóm tắt là một div với lớp summary_text.
Sử dụng CSS hoặc XPath
Selenium hỗ trợ chọn các phần tử từ trang sử dụng CSS. (CSS hỗ trợ phương ngữ là CSS2). Ví dụ để chọn văn bản tóm tắt từ trang IMDB ở trên, bạn viết:
WebElement summaryEl = driver.findElement(By.cssSelector("div.summary_text"));
Ngoài ra bạn cũng có thể sử dụng Xpath để chọn các phần tử theo cách giống nhau. Để chọn văn bản tóm tắt:
WebElement summaryEl = driver.findElement(By.xpath("//div[@class='summary_text']"));
XPath và CSS có các tính năng tương tự nên bạn có thể lựa chọn một trong hai để sử dụng.
Đọc Google Mail từ Java
Dưới đây là ví dụ phức tạp hơn: tìm nạp Google Mail.
Khởi động Chrome Driver, điều hướng đến gmail.com và chờ cho đến khi trang đượ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 tìm khung email (tên được đặt bằng ID nhận dạng) và nhập địa chỉ email. Click chọn nút Next và chờ tải trang nhập mật khẩu.
/* Type in username/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() );
Now, we enter the password, click the Next button again and wait for the Gmail page to load.
/* Type in password */
{
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.
List rows = driver
.findElements(By.xpath("//div[@class='Cp']//table/tbody/tr"));
for (WebElement tr : rows) {
}
Với mỗi mục nhập, tìm nạp khung From. Lưu ý một số mục From có thể có nhiều phần tử, tùy thuộc vào số lượng người trong cuộc hội thoại.
{
/* From Element */
System.out.println("From: ");
for (WebElement e : tr
.findElements(By.xpath(".//div[@class='yW']/*"))) {
System.out.println(" " +
e.getAttribute("email") + ", " +
e.getAttribute("name") + ", " +
e.getText());
}
}
Tiếp theo tìm nạp đối tượng.
{
/* Subject */
System.out.println("Sub: " + tr.findElement(By.xpath(".//div[@class='y6']")).getText());
}
And the date and time of the message.
{
/* Date/Time */
WebElement dt = tr.findElement(By.xpath("./td[8]/*"));
System.out.println("Date: " + dt.getAttribute("title") + ", " +
dt.getText());
}
Dưới đây là tổng số hàng email trên trang.
System.out.println(rows.size() + " mails.");
Sau khi hoàn tất, đóng cửa sổ trình duyệt lại.
driver.quit();
http://thuthuat.taimienphi.vn/cach-crawl-du-lieu-trang-web-bang-selenium-30079n.aspx
Trên đây là cách crawl dữ liệu trang web bằng Selenium với Google Chrome. Với Google Chrome Inspector, bạn có thể dễ dàng tìm ra CSS hoặc XPath để trích xuất hoặc tương tác với phần tử.