Hỏi về API lấy dữ liệu

Hiện tại em đang tiến hành crawl trang web vicare.vn để phục vụ học tập. Em có thấy ở trang danh sách các câu hỏi và bài viết cộng đồng của trang này (https://vicare.vn/hoi-bac-si/) có dùng infinite scroll. Em inspect network thì thấy gọi api dạng kiểu như https://vicare.vn/api/v2/thread/?scrollID=fdasfdasfdsa… mà không phải là page=? như các tutorial hay hướng dẫn. Không biết ai đã có kinh nghiệm mấy API như thế này có thể chia sẻ cho em biết là làm ntn được không ạ. Em muốn dùng API lấy dữ liệu luôn mà gọi nó chỉ trả về đúng 10 kết quả như nhau

Sao thấy có cần điền scrollID đâu nhỉ https://vicare.vn/api/v1/cms_posts/

Về mấy bài viết này thì không cần scroll Id nó cũng sẽ trả về random các bài viết khác nhau nhưng em đang crawl câu hỏi của người dùng bằng api https://vicare.vn/api/v2/thread/. Api này nếu không truyền scrollID vào thì lúc nào cũng chỉ trả về 10 items đầu giống nhau thôi :frowning:

Điều scrollID vào thì mỗi lần ra mỗi page khác nhau mà nhỉ?

https://vicare.vn/api/v2/thread/?scroll_id=cXVlcnlUaGVuRmV0Y2g7MjsyMzM5NTgyMzM6UXRQazhyWFNUT1dnNER6ZlJMam4yQTsyMzM5NTgyMzQ6UXRQazhyWFNUT1dnNER6ZlJMam4yQTswOw==
1 Like

Ô sao nãy em cóp thử 1 cái id nó toàn ra giống nhau, em cám ơn nhé. Mà anh cho em hỏi không biết sao họ lại làm kiểu ntn nhỉ

Đây là kĩ thuật phân trang nhưng không sử dụng skip và limit, bạn có thể tham khảo thực hành trong Mongodb:


Kĩ thuật này không thể phân ra các trang có số cụ thể, chính vì vậy người ta mới dùng infinite scroll.

1 Like

Cám ơn bác, để em ngâm cứu

Trong couchdb thì không phân trang theo kiểu skip, limit mà dùng id để đánh dấu trang, limit để trả về số lượng, dữ liệu được sort mặc định theo id. Nếu truyền vào id giống nhau thì trả về kết quả như nhau, nếu id không khai báo thì trả về limit kết quả đầu tiên, và có kèm theo total_rows là tổng số doc hiện có.

1 Like

Thế cái id của các trang này được gen như thế nào vậy bác, em có thử lấy 1 url mà trang vicare gọi, dùng postman thì thấy cùng 1 scrollID nhưng mỗi lần trả về các kết quả khác nhau, nhưng cũng cái id đấy để tầm một lúc lâu sau thì chỉ trả về đúng 10 kết quả đầu tiên, phải vào trang web để lấy cái id khác

Cái scroll_id là 1 mã base64, decode ra thì thấy queryThenFetch, đây là 1 lệnh của ElasticSearch.
Mình kiểm tra thử thì thấy scroll_id không thay đổi gì cả nhưng kết quả vẫn thay đổi. Có khi người ta dùng session chăng.

1 Like

Mình đã từng làm rất nhiều bài toán crawl data kiểu này rồi. Lời khuyên của mình là bạn hãy tìm hiểu và sử dụng Selenium. Chắc không mất quá 50 dòng code để lấy dữ liệu đâu.

Ý tưởng: Cho nó cuộn xuống cuối trang chừng nào vẫn có thể cuộn, rồi lấy page_source để parse.

2 Likes

Dùng headless browser tốc độ crawl sẽ chậm hơn. Bất đắc dĩ mới dùng

3 Likes

bác lấy api này ở đâu thế, em đang tìm api lấy danh sách các bệnh viện?

Mình lấy trên trang vicare.vn. Trang này cũng có danh sách về các cơ sở y tế đấy nhưng k có api. Bác có thể thử crawl xem

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?