Bạn đã bao giờ được giao một công việc đi thống kê dữ liệu về một chủ đề nào đó chưa? Về cơ bản công việc đó sẽ là lên mạng tra cứu và tìm các trang chứa thông tin cần thiết và copy nó về. Thế nhưng sau khi đã chăm chỉ copy kha khá dữ liệu thì sếp bạn yêu cầu một khối lượng gấp 100, 1000 lần số lượng bạn đã thống kê.
Thật khó để giải quyết yêu cầu trên bằng cỗ máy chạy bằng cơm vậy nên để giải quyết bài toán này mình đã nghĩ đến Web Scraping.
1. Web Scraping là gì ?
Web scraping là việc trích xuất tài liệu từ một website. tin tức này được tích lũy và tổng hợp để cung ứng một nhu yếu nào đó từ người dùng như :
- Trích xuất giá sản phẩm để từ đó phân tích giá sản phẩm trên thị trường
- Trích xuất dữ liệu về cổ phiếu
- Trích xuất dữ liệu về việc làm
- Copy sản phẩm để làm dropshipping
- Copy dữ liệu để học tập
- Phục vụ dữ liệu cho data mining….
Tóm lại Web scraping có thể làm rất nhiều việc. Điều quan trọng là bạn sử dụng dữ liệu đó như thế nào để mang lại hiệu quả cho mình
Bạn đang đọc: Web Scraping Với Java Như Thế Nào?
2. Thực hành web scraping với Java
Vì sao mình chọn ngôn từ Java đơn thuần vì bản thân mình sử dụng nó tốt nhất và cũng thích nó nhất
- Sử dụng thư viện jsoup.org một công cụ mạnh mẽ để trích xuất dữ liệu. Bạn có thể sử dụng nó để phân tích HTML từ URL, tệp và Chuỗi. Nó cũng có thể thao tác các phần tử hoặc thuộc tính HTML.
- Trang web mình hướng tới là trang web mình đang luyện thi TOEIC luôn englishfreetest.com vì trang đó có một loạt bài ngữ pháp tiếng anh rất hay và mình muốn lấy dữ liệu tạo một file riêng cho mình để đỡ tốn dung lượng 4G hàng ngày =))
Các bước thực hiện:
- Phân tích website
- Lấy danh sách các bài viết từ danh mục bài viết trên website
- Sau khi đã lấy được danh sách các bài viết cần lấy nội dung từng bài viết đó
2.1. Phân tích website
Phân tích trang danh mục bài viết
Truy cập trang hạng mục bài viết và dùng công cụ “ Developer tools – F12 ” thần thánh
Ta sẽ thấy được chỗ cần tìm link bài viết được nằm trong thẻ H2 con của DIV class = “ post-content ”
Phân tích trang nội dung bài viết
Tiếp tục sử dụng công cụ “ Developer tools – F12 ” như trên
Ta sẽ thấy được chỗ cần tìm, nội dung bài viết nằm ở
Ok vậy là đã nghiên cứu và phân tích xong. Giờ triển khai code thôi .
2.2. Lấy danh sách các bài viết
Thông qua Jsoup thực thi request tới link hạng mục những bài viết ở đây tôi để thời hạn timeout là 20 s đây là khoảng chừng thời hạn chương trình chờ hiệu quả trả về từ website ( tùy vào website cũng như nội dung tài liệu mà bạn cần lấy mà xác lập số lượng timeout cho tương thích )
Sau khi trả về tác dụng trả về trải qua nghiên cứu và phân tích đã thực thi ở bước trên tất cả chúng ta lấy link list những bài viết bằng việc duyệt những thành phần mà Jsoup đã lấy được
package com.webscraping;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
/**
* NHT
*/
public class Demo {
public static void main(String[] args) {
String url = "https://englishfreetest.com/courses-tips-articles/english-tenses.html";
Document doc = null;
try {
doc = Jsoup
.connect(url)
.userAgent("Jsoup client")
.timeout(20000).get();
//lấy danh sách các thể chứa bài viết từ kết quả trả về
Elements lstArticles = doc.select("div.post-content h2 a");
for (Element element : lstArticles) {
// Link bài viết nằm trong thuộc tính href của thẻ
System.out.println("link:"+element.attr("href"));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
tác dụng trả về :
Lấy danh sách các bài viết
Duyệt list những bài viết đã lấy được ở trên và với mỗi bài viết liên tục sử dụng Jsoup thực thi request. Lấy tài liệu trả về nghiên cứu và phân tích và lấy nội dung bài viết theo nghiên cứu và phân tích đã triển khai ở trên
package com.webscraping;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
/**
* NHT
*/
public class Demo {
public static void main(String[] args) {
String url = "https://englishfreetest.com/courses-tips-articles/english-tenses.html";
Document doc = null;
try {
doc = Jsoup
.connect(url)
.userAgent("Jsoup client")
.timeout(20000).get();
//lấy danh sách các thể chứa bài viết từ kết quả trả về
Elements lstArticles = doc.select("div.post-content h2 a");
for (Element element : lstArticles) {
// Link bài viết nằm trong thuộc tính href của thẻ
System.out.println("link:"+element.attr("href"));
doc = Jsoup
.connect(element.attr("href"))
.userAgent("Jsoup client")
.timeout(20000).get();
//Lấy nội dung bài viết
Elements article = doc.select("article.post");
// Ở đây tôi cần nội dung bài viết dạng html nên không cần phân tích tiếp nữa
System.out.println(article.get(0).html());
// Do something
//............................
//............................
//............................
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Thành quả
Tất nhiên để ra được file Word trên bạn cần code thêm cả phần tạo file word từ dữ liệu thu thập được nữa. Tuy nhiên do khuôn khổ bài viết chỉ là giới thiệu Web scraping với Java nên mình không để cập ở đây.
Một số chú ý:
- Đây chỉ là một ví dụ nho nhỏ để các bạn hiểu Web scraping với Java và cách thực hiện tuy nhiên khi một yêu cầu cần thống kê số lượng dữ liệu lớn, và lượng data phân tích nhiều bạn nên suy nghĩ đến việc dùng Thread để chia luồng và thực hiện đồng thời.
- Thử suy nghĩ viết dạng mở rộng để tạo thành một module khi cần lấy dữ liệu một site nào đó chỉ cần cấu hình ?
- Việc lấy dữ liệu của người khác suy cho cùng là không đúng nên hãy dùng nó vào các mục đích tốt đẹp nhé (ví dụ như là để thực hành kỹ năng code của mình)
Chúc những bạn thành công xuất sắc !
Source: kubet
Category: Tải Phầm Mềm
Leave a Reply