Trong bài tutorial Trích xuất nội dung bài đăng sử dụng Boilerpipe, chúng ta đã viết chương trình để lấy nguyên phần nội dung chính của bài viết và loại bỏ các nội dung không cần thiết. Tuy nhiên, việc sử dụng Boilerpipe có nhiều điểm hạn chế do thư viện này không cung cấp các hàm chức năng để truy xuất các thông tin quan trọng khác như tên tác giả, thời gian đăng, số điện thoại,…Do đó, trong bài tutorial này chúng ta sẽ tìm hiểu một công cụ có nhiều tính năng hơn nổi trội hơn, đó là Apache Tika (Boilerpipe cũng đã được tích hợp vào trong công cụ này)

Apache Tika là một toolkit tích hợp các thư viện parser có sẵn để phát hiện và trích xuất metadata (các thông tin về file như tên file, tên tác giả,..) cũng như các thông tin có cấu trúc từ nhiều nguồn dữ liệu khác nhau (web, word, pdf,…. Các bạn có thể tham khảo các định dạng file mà Tika hỗ trợ tại đây).

Tika cung cấp hai Interface chính là Parser InterfaceDetector Interface. Detector Interface được sử dụng để phát hiện các thông tin như định dạng file (bằng cách xem xét các bytes bắt đầu của file, tên đuôi file, common container format,….) và phát hiện ngôn ngữ được sử dụng trong file (các bạn tham khảo danh sách các ngôn ngữ Tika có thể phát hiện được tại đây)

Parser Interface là interface được phát triển để giúp người dùng có thể dễ dàng thực hiện các thao tác trích xuất thông tin bằng việc sử dụng một trong hai hàm sau:

– InputStream stream: là input stream cần được xử lý. Parser sẽ tiến hành các thao tác xử lý stream này nhưng không thực hiện việc đóng stream. Do đó ta cần đóng stream này như sau:

– ContentHandler handler: là các Handler được dùng để trích xuất các thông tin cần thiết. Ví dụ như LinkContentHandler để liệt kê tất cả các đường links hoặc PhoneExtractingContentHandler để liệt kê tất cả các số điện thoại trong dữ liệu đầu vào

– Metadata metadata: là thuộc tính metadata của dữ liệu đầu vào như title, description, date,… (ta có thể sử dụng metadata.name() để liệt kê tên của các thuộc tính của metadata)

– ParseContext context: thường được sử dụng khi người dùng muốn thực hiện cấu hình các thông số của việc parsing

Thông thường sau khi xử lý dữ liệu đầu vào (input stream), Tika sẽ trả kết quả về handler và metadata object. Từ handler và metadata object này, ta có thể truy xuất các thông tin cần thiết phù hợp với từng yêu cầu cụ thể

Trong bài tutorial này, chúng ta sẽ thực hành viết chương trình sử dụng Tika để trích xuất nội dung chính của một bài báo trên trang cnn.com, liệt kê tất cả đường link và số điện thoại trong bài báo này, phát hiện ngôn ngữ được sử dụng và tìm các thông tin metadata. Trước hết ta thêm hai dependency sau vào file pom.xml:

Trong hàm main của WebScrapingTika class, ta tạo một InputStream là dữ liệu từ URL cho trước như sau:

Tiếp theo, ta tạo 3 tham số còn lại của hàm .parse() là MetaData, ParseContext và ContentHandler (ở đây ta dùng ProfilingHandler để phát hiện ngôn ngữ sử dụng trong bài báo, BoilerpipeContentHandler để trích xuất nội dụng chính, LinkContentHandler để liệt kê tất cả đường links, PhoneExtractingContentHandler để tìm các số điện thoại và TeeContentHandler để kết hợp các Handlers)

Sau đó, ta sử dụng AutoDetectParser để truy xuất thông tin như sau (các bạn có thể tham khảo các Parser khác tại đây):

Cuối cùng ta thực hiện việc in kết quả ra màn hình:

– Hiện thị ngôn ngữ được sử dụng, Tiêu đề và nội dung chính của bài viết:

Nếu chỉ sử dụng BodyContentHandler mà không sử dụng Boilerpipe ta sẽ được kết quả là toàn bộ dòng text trong trang web, bao gồm cả các đoạn text không phải là nội dung bài báo:

– Hiện thị các thông tin về metadata

– Liệt kê số điện thoại và các links có trong bài đăng:

Như vậy ta đã hoàn thành việc viết chương trình sử dụng Tika để truy xuất các thông tin từ một bài báo đăng trên trang cnn.com. Các bạn cũng có thể thực hiện tương tự với các định dạng khác như word, pdf, image,.. chỉ khác là ta sử dụng FileInputStream để đọc dữ liệu đầu vào. Ví dụ như:

Các bạn có thể tham khảo full code của chương trình dưới đây.

Tháng Mười Hai 26, 2018
ITechSeeker