Hướng dẫn render html golang - kết xuất html golan
Crawl dữ liệuCrawl là một việc khá thường gặp trong quá trình phát triển phần mềm. Đó là việc mà ta sử dụng các công cụ (plugins, modules, tools…) để phân tích, bóc tách dữ liệu từ nguồn nội dung để thu thập những thông tin cần thiết phục vụ cho mục đích riêng của chúng ta (có thể lưu vào DB, XML, JSON, CSV...). Chẳng hạn như những công việc lấy tin tức trên báo, lấy thông tin giảm giá, ... đều là 1 dạng crawl. Cách để chúng ta crawl dữ liệu đó là phân tích HTML, đọc các thẻ và rút trích dữ liệu. Mỗi trang nội dung nguồn mà ta cần lấy dữ liệu sẽ có cấu trúc HTML khác nhau, bố cục khác nhau cho nên tùy vào từng website mà ta sẽ có cách phân tích HTML riêng. là một việc khá thường gặp trong quá trình phát triển phần mềm. Đó là việc mà ta sử dụng các công cụ (plugins, modules, tools…) để phân tích, bóc tách dữ liệu từ nguồn nội dung để thu thập những thông tin cần thiết phục vụ cho mục đích riêng của chúng ta (có thể lưu vào DB, XML, JSON, CSV...). Chẳng hạn như những công việc lấy tin tức trên báo, lấy thông tin giảm giá, ... đều là 1 dạng crawl. Cách để chúng ta crawl dữ liệu đó là phân tích HTML, đọc các thẻ và rút trích dữ liệu. Mỗi trang nội dung nguồn mà ta cần lấy dữ liệu sẽ có cấu trúc HTML khác nhau, bố cục khác nhau cho nên tùy vào từng website mà ta sẽ có cách phân tích HTML riêng. là một việc khá thường gặp trong quá trình phát triển phần mềm. Đó là việc mà ta sử dụng các công cụ (plugins, modules, tools…) để phân tích, bóc tách dữ liệu từ nguồn nội dung để thu thập những thông tin cần thiết phục vụ cho mục đích riêng của chúng ta (có thể lưu vào DB, XML, JSON, CSV...). Chẳng hạn như những công việc lấy tin tức trên báo, lấy thông tin giảm giá, ... đều là 1 dạng crawl. Cách để chúng ta crawl dữ liệu đó là phân tích HTML, đọc các thẻ và rút trích dữ liệu. Mỗi trang nội dung nguồn mà ta cần lấy dữ liệu sẽ có cấu trúc HTML khác nhau, bố cục khác nhau cho nên tùy vào từng website mà ta sẽ có cách phân tích HTML riêng. Đối với các ngôn ngữ quen thuộc: PHP, Java,... chúng ta có nhiều thư viện sử dụng để crawl dữ liệu, nhưng hôm nay mình xin giới thiệu package Goquery của Golang thông qua 1 ví dụ nho nhỏ.Golang thông qua 1 ví dụ nho nhỏ.Golang thông qua 1 ví dụ nho nhỏ. Ý tưởngMình cần thu thập những thông tin cơ bản của các cuốn sách điện tử (ebook) từ website thư viện tài liệu học tập: http://tailieu123.net và lưu vào file JSON. Mình sẽ lấy thông tin ebook thông qua các danh mục. Hôm nay, với mục đích chính là giới thiệu công cụ crawl data - Goquery nên mình sẽ chỉ lấy hết ebook trong 1 danh mục. Các bạn có thể phát triển thêm bằng cách lấy hết ebook trong tất cả danh mục. Trong danh mục, do có nhiều tài liệu nên dữ liệu đã được phân trang. Ý tưởng là mình sẽ lấy hết ebook thông qua từng page được hiển thị. Các bước thực hiện1. Tính tổng số trang của danh mục.2. Sau khi lấy được tổng số trang, ta sẽ lấy tất cả ebook trong từng trang. Việc làm này mình sẽ tận dụng khả năng xử lý đồng thời concurrency của Go lấy ebook đồng thời từ các trang. 3. Sau khi lấy được dữ liệu, ta lưu lại dữ liệu vào file output.json.2. Sau khi lấy được tổng số trang, ta sẽ lấy tất cả ebook trong từng trang. Việc làm này mình sẽ tận dụng khả năng xử lý đồng thời concurrency của Go lấy ebook đồng thời từ các trang. 3. Sau khi lấy được dữ liệu, ta lưu lại dữ liệu vào file output.json. 2. Sau khi lấy được tổng số trang, ta sẽ lấy tất cả ebook trong từng trang. Việc làm này mình sẽ tận dụng khả năng xử lý đồng thời concurrency của Go lấy ebook đồng thời từ các trang. 3. Sau khi lấy được dữ liệu, ta lưu lại dữ liệu vào file output.json. Cài đặt
Code
Sau đó, ta có thể chạy command line: go run main.go http://tailieu123.net/danh-muc-tai-lieu/2-thpt-on-thi-thpt-qg 1. Tính tổng số trang của danh mục. Việc này khá đơn giản, ta chỉ cần biết được trang cuối cùng của danh mục là trang số mấy? Chúng ta sẽ dùng Goquery để bóc tách để lấy ra thuộc tính href của thẻ a trong li:last-child tức là lấy ra đường link của trang cuối cùng. Sau khi lấy được link của trang cuối cùng ta sẽ split nó để lấy ra trang cuối cùng - cũng chính là tổng số trang. Trong ví dụ này, mình lấy được link của trang cuối là: http://tailieu123.net/danh-muc-tai-lieu/2-thpt-on-thi-thpt-qg?page=6 => Số trang sẽ là 61. Tính tổng số trang của danh mục. Việc này khá đơn giản, ta chỉ cần biết được trang cuối cùng của danh mục là trang số mấy? Chúng ta sẽ dùng Goquery để bóc tách 1. Tính tổng số trang của danh mục. Việc này khá đơn giản, ta chỉ cần biết được trang cuối cùng của danh mục là trang số mấy? Chúng ta sẽ dùng Goquery để bóc tách
2. Sau khi lấy được tổng số trang, ta sẽ lấy tất cả ebook trong từng trang. Chúng ta cần xác định thẻ HTML của mỗi ebook là thẻ gì? Ở đây mình đã tìm ra đó là class .2pin trong class .col-left Chúng ta cần xác định thẻ HTML của mỗi ebook là thẻ gì? Ở đây mình đã tìm ra đó là class .2pin trong class .col-left Chúng ta cần xác định thẻ HTML của mỗi ebook là thẻ gì? Ở đây mình đã tìm ra đó là class .2pin trong class .col-left
3. Sau khi lấy được dữ liệu, ta lưu lại dữ liệu vào file output.json. Phần việc còn lại là khá đơn giản, khi dữ liệu mà ta lấy ra đã có kiểu dữ liệu là Ebooks Phần việc còn lại là khá đơn giản, khi dữ liệu mà ta lấy ra đã có kiểu dữ liệu là Ebooks Phần việc còn lại là khá đơn giản, khi dữ liệu mà ta lấy ra đã có kiểu dữ liệu là Ebooks
Kết quả mà mình đã thu thập được từ danh mục tài liệu: http://tailieu123.net/danh-muc-tai-lieu/2-thpt-on-thi-thpt-qg Số trang: 6. Số ebook: 139. Đây là toàn bộ source code của mình, các bạn có thể tham khảo thêm. Nhận xét
Hy vọng qua ví dụ nhỏ này của mình sẽ giúp ích phần nào đó để các bạn có thể sử dụng Golang để crawl dữ liệu. Đây là bài viết đầu tay của mình trên Viblo chắc hẳn sẽ có nhiều sai sót cộng với nguồn kiến thức hạn hẹp, mình rất mong nhận được những ý kiến đóng góp của các bạn để những bài viết sau của mình tại Viblo có chất lượng tốt hơn. Mình xin cảm ơn!Viblo chắc hẳn sẽ có nhiều sai sót cộng với nguồn kiến thức hạn hẹp, mình rất mong nhận được những ý kiến đóng góp của các bạn để những bài viết sau của mình tại Viblo có chất lượng tốt hơn. Mình xin cảm ơn!Viblo chắc hẳn sẽ có nhiều sai sót cộng với nguồn kiến thức hạn hẹp, mình rất mong nhận được những ý kiến đóng góp của các bạn để những bài viết sau của mình tại Viblo có chất lượng tốt hơn. Mình xin cảm ơn! |