Hướng dẫn tạo 1 ứng dụng Android bằng Flutter + NodeJs – Phần 2

Tram Ho

Hello mọi người lại là mình đây, tiếp tục với loạt bài học cách xây dựng 1 ứng dụng hoàn chỉnh, phần 2 này mình sẽ giới thiệu phần chuẩn bị dữ liệu bằng cách crawl data. Nhưng trước khi viết tiếp mình muốn nói 1 điều ở đây là việc crawl dữ liệu cũng có nhiều mặt trái khác nhau, và mình khuyên bạn hãy tìm hiểu và sử dụng sao cho hợp lý và có ý nghĩa.

Ngôn ngữ sử dụng để crawl là Java

Trang web cần crawl là cooky.vn

Library hỗ trợ việc parse HTML là jsoup

Library hỗ trợ việc parse JSON là gson

Tool hỗ trợ việc call API là Postman

Một số kỹ năng nên biết:

  • Cơ bản cấu trúc các thẻ HTML
  • Sử dụng dev tool trên browser (F12 Chrome)
  • Call API và parse JSON
  • Đọc ghi file

Trang cooky thì có rất nhiều dữ liệu và mình chỉ cần lấy các dữ liệu sau:

  • Danh sách danh mục món ăn
  • Danh sách các món ăn theo danh mục
  • Thông tin chi tiết về món ăn

1. Danh sách danh mục món ăn

bạn vào đường dẫn này: https://www.cooky.vn/cach-lam và nhấn F12 để bật dev tool của trình duyệt, vào phần Network, chọn Fillter là XHR

bạn chú ý những phần mình khoanh đỏ trong hình và các mục 1, 2, 3. Mục 3 chính là danh sách danh mục món ăn mình cần lấy, khoảng chừng 30 tên. Vì chỉ đơn giản là text nên bạn có thể tự ghi lại bằng tay, nhưng để việc crawl được chuyên nghiệp hơn thì bạn hãy xem mục 1, 2. Đây là nơi bạn có thể tìm thấy API của trang web dùng để get ra list danh mục này. Như hình bạn cũng đã thấy có 1 API tên getfillter và bên cạnh là response trả về. Đọc sơ qua response thì thấy nó chứa tên của các danh mục mình cần lấy, vậy không còn bàn cãi gì nữa đây chính là API cần tìm cho việc get danh sách danh mục món ăn rồi. Để xem chi tiết các thông tin như url, request method, param… bạn chuyển sang tab Headers (cạnh tab Preview ấy). Sau khi có các thông tin cần thiết thì bạn có thể dùng postman để gọi thử và việc còn lại là viết code để get data thôi. Nếu bạn không thấy API getfillter thì hãy F5 để refresh lại trang web nhé.

Mình sẽ hướng dẫn bạn cách chạy API bằng postman cho trực quan. Đầu tiên hãy chuyển qua tab Headers và để ý các thông số: Request URL, Request Method, Request Headers, Request Payload

như hình thì mình sẽ có được các thông tin cần thiết cho 1 request:

  • url: https://www.cooky.vn/directory/getfilter
  • mothod: POST
  • headers: Content-Type: application/json
  • body gửi lên (dạng JSON): {“Keyword”:””,”Type”:”course”,”SelectedIds”:[],”PageSize”:200,”PageIndex”:1}

với những thông số trên bạn config vào postman để thấy rõ kết quả trả về từ API.

kết quả trả về đã có dữ liệu mình cần, nhưng chưa phải dữ liệu mình mong muốn. Ở đây mình chỉ cần quan tâm đến 2 trường đó là Id, Name. Vậy bước tiếp theo bạn cần làm sau khi load được dữ liệu này về từ API là trích xuất, bóc tách 2 thuộc tính này từ JSON và lưu vào file riêng của mình. Sau 1 vài đoạn code phân tách mình sẽ được dữ liệu mong muốn như sau:

2. Danh sách món ăn theo danh mục

Bước khởi đầu lúc nào cũng gian nan phải không nào, sau khi bạn đã quen với việc crawl rồi thì với các bước sau sẽ trở nên dễ dàng hơn rất nhiều.

bạn tiếp tục vào đường dẫn này https://www.cooky.vn/cach-lam , click vào từng danh mục để xem có thấy API nào mình cần tìm không.

Bạn để ý dưới phần log thì có API search và dữ liệu bên cạnh + xem UI của trang web thì đây đúng là API mình có thể dùng được rồi. Vẫn với các bước tương tự như ở phần 1, mình sẽ xem phần header rồi param request ở header của dev tool và thử chạy trên postman để xem kết quả trực quan.

bạn cần config postman như sau để call được API này:

và đây là kết quả

mình giải thích 1 chút về config này:

  • số lượng param: mặc dù trên dev tool API này cần rất nhiều param gửi lên như dt, q, st, page... nhưng ở bài viết này mình chỉ truyền lên mỗi param dt. Vì có những param không cần thiết và mình cũng chẳng biết nó là gì, nên chỉ lấy cái nào mình cần thui. Còn tại sao lại cần param dt? vì khi bạn click vào từng loại danh mục như sacks, lẩu, sữa chua… thì bạn sẽ thấy param này thay đổi giá trị. Đây có thể là id của danh mục này, dựa vào đây để request server trả về loại món ăn tương ứng với danh mục. Còn nhiều cái hay ho hơn nữa bạn có thể tự tìm hiểu thêm, ở đây mình chỉ nói như vậy để các bạn hiểu cho dễ.
  • giá trị của param dt: để lấy được giá trị của param này thì như mình nói ở trên, bạn cứ click lần lượt vào các danh mục sẽ thấy dt thay đổi giá trị: 122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,140,104,105,106,107,108,109,110,111,112,113,114,115,117,118,119,120,121

Vẫn như API trước, mình cũng chỉ quan tâm đến các dữ liệu mình cần như name, totaltime, level, img, ingredient... . Bạn lại tiếp tục sử dụng kỹ năng call API và phân tách JSON để lấy được các dữ liệu mình mong muốn.

Đây là danh sách các món ăn của 1 danh mục, với các danh mục khác bạn cũng làm tương tự như vậy. 1 vòng for là ổn phải không nào =))

3. Thông tin chi tiết về món ăn

Về phần thông tin chi tiết của 1 món ăn bạn click vào 1 món ăn bất kỳ để xem các thông tin cần lấy tiếp theo là gì. Ở đây mình chỉ lấy thêm 1 số thông tin về các bước làm + hình ảnh đi kèm với các bước làm tương ứng. Ngoài ra bạn có thể lấy thêm thông tin như: số lượt like, user….

Vẫn là bước làm quen thuộc là xem dev tool xem có lấy được gì không? nhưng lần này ở tab XHR mình không tìm được API mình cần về thông tin món ăn. Vậy có lẽ ở phần này trang web sẽ không call API như ở 2 phần trước nữa. Vậy mình sẽ chuyển sang tab All để tìm lần lượt, chắc chắn là sẽ có trong này, chỉ là nó nằm ở reques nào thôi.

Ví dụ ở đây mình vào link món ăn này: https://www.cooky.vn/cong-thuc/song-so-nuong-giay-bac-52495

thì ở ngay request đầu tiên của tab All mình thấy thông tin cần lấy nằm ở đây, nhưng nó không phải dạng JSON như 2 phần trên mà là server sẽ trả về 1 page dạng HTML. Các thông tin mình cần lấy sẽ nằm trong các thẻ HTML, lúc này sẽ là lúc mình dùng đến thư viện Jsoup để bóc tách các thẻ HTML và lấy thôn tin mình cần.

Để xem được nội dung file HTML, bạn chỉ cần chuột phải và chọn View page source (Ctrl + U). Bạn sẽ thấy 1 file HTML cả hàng nghìn dòng code, nhưng đừng vội hoang mang bạn chỉ cần quan tâm đến phần nội dung mình cần lấy, và cấu trúc các thẻ HTML chứa nội dung của mình cần. Ở đây mình chỉ trích dẫn đoạn HTML chứa nội dung các bước làm thôi nha.

bạn sẽ thực hiện bóc tách dữ liệu trong đoạn HTML này. Nhưng nếu bạn đọc kỹ hơn file HTML của cả trang, bạn sẽ thấy 1 đoạn HTML cũng chưa thông tin bạn cần nhưng đơn giản hơn đoạn HTML trên rất nhiều. Mình tìm được như sau:

Bây giờ bạn đã thấy dễ hơn chưa nào. Ở đây mình xin phép không viết đoạn code parse HTML ở đây, 1 phần vì cấu trúc HTML của trang web có thể thay đổi liên tục, 2 là để các bạn tự mày mò phần nào.

Đến đây mình đã có toàn bộ dữ liệu của 3 phần mình cần, ví dụ 1 món ăn như sau:

nếu bạn nào không tự crawl được dữ liệu thì có thể dùng các file mình đã crawl trước đỏ, tại đây.

Dữ liệu sau khi lấy được mình đều đưa hết về dạng JSON để sau này làm API cho dễ. Việc cấu trúc JSON thì tùy thuộc vào mỗi người, việc crawl được dữ liệu mà mỗi người mong muốn cũng giống như việc bạn chỉnh sửa ảnh vậy, chỉnh đến lúc nào mình thấy ảnh đẹp thì thôi.

Hẹn gặp các bạn ở các phần sau.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo