Crawler
What?
Là một công cụ có chức năng chính là tự động trích rút thông tin từ một nguồn nào đó
For what?
Dùng trong nhiều lĩnh vực như:
+ Seo: Tự động lấy bài trên các trang khác, đăng lên website vệ tinh, mục đích là để phủ bài hoặc cho google index (vì google index các trang theo từng khoảng thời gian, nên chuyện gì sẽ xảy ra nếu như mình lấy được bài và post trong khoảng vài giây???)
+ Thu thập dữ liệu: Một số tác vụ cần một lượng lớn dữ liệu, như xử lý hình ảnh, xử lý ngôn ngữ tự nhiên…lấy từ từ đâu??? internet !. Ví dụ vlsp.hpda.vn/demo/?page=resources lấy dữ liệu từ các trang báo làm dữ liệu huấn luyện các công cụ xử lý ngôn ngữ.
+ Tạo các site phân tích, thống kê, so sánh giá trong thương mại điện tử. Nếu đối thủ đột ngột hạ giá một sản phẩm nào đó thì sao, ít nhất nếu mình biết được điều đó cũng khá có ích phải không!
+ …
How?
Để làm crawler thì có vô vàn cách, gần như ngôn ngữ lập trình nào cũng làm được, tất nhiên là python có thể làm tốt.
Thường thì crawler cơ bản cần có 3 bước: Lấy dữ liệu – Trích rút thông tin cần lấy – Lưu trữ
Với python thì:
+ Lấy dữ liệu: Sử dụng thư viện request để lấy html từ trang web cần lấy.
+ Trích rút thông tin cần lấy: Sử dụng thư viện BeautifulSoup để trích rút dữ liệu.
+ Lưu trữ: Có thể lưu ra file json, excel, csv hay db tùy thích.
Dưới đây là một đoạn code ngắn mà python4life sử dụng để mô tả một quá trình crawler các tin gồm tiêu đề, ảnh và mô tả của các bài viết ở mục sự kiện của trang dantri.com.vn

- Nếu có lỗi thiếu thư viện thì cần install hai thư viện là request và beautifilsoup
python3 -m pip install requests
python3 -m pip install beautifulsoup4 |
Chỉ trong khoảng 16 dòng code là đã crawler được các bài viết từ trang dantri cho thấy sức mạnh của python ở sự đơn giản của nó.
Problem
Tuy đoạn code trên khá đơn giản để hiểu và làm theo nhưng tất nhiên đây chỉ là một đoạn demo về ý tưởng, chưa thể trở thành một sản phẩm chạy được do có một số vấn đề sau:
– Code khá đơn giản, chạy hardcode 1 link.
– Với trang dân trí thì ok, nhưng một số trang khác như vne thì sẽ lỗi lấy ảnh, do cơ chế vne sử dụng js để load ảnh động.
– Chạy đơn luồng, không thể áp dụng vào thực tế.
– Code theo site cần lấy, khi cần crawl từ trang khác thì sao => sửa code => không ổn.
– Đây là trang tin tức thì khá đơn giản, Muốn lấy từ các diễn đàn, trang bán hàng online như shopee, tiki, lazada thì sao?
– Lấy xong chưa biết làm gì ngoài ngắm cho vui?
Solved
Để làm một công cụ crawler hoàn chỉnh, sẽ cần các cải tiến sau:
– Cấu trúc chương trình tốt, chia ra các module nhỏ để dễ dàng cải tiến, thêm bớt
– Với các trang phức tạp (Cần đăng nhập, chuyển link, hay chạy javascript) thì thay vì dùng thư viện request, cần phải sử dụng selenium để mở trình duyệt và tự động thao tác như một người dùng bình thường sau đó mới lấy dữ liệu. theo cách này thì gần như không có gì không thể lấy.
– Sử dụng cơ chế queue/distributed để chạy nhiều thread, nhiều computer, phân chia các url để crawl nhanh nhất có thể, mở rộng đơn giản là thêm máy.
– Các cách lấy nên được mô tả bằng một script để có thể linh động lấy từ các trang khác nhau.
– Lấy xong kết hợp với một số api để post lên site wordpress/blogspot của mình.
– Để triển khai nhanh chóng và hiệu quả, toàn bộ ứng dụng nên được triển khai trên nền tảng docker/k8s.
Nếu có góp ý hay cần sự giúp đỡ, đừng ngại liên hệ ngay./