Ngôn ngữ hay Framework nào tốt nhất cho việc Crawl (Web Scraping) dữ liệu website? Scrapy là gì?

Web Scraping hay dân dã hay gọi là crawler dữ liệu từ các website dịch một cách ngắn gọn là bạn muốn lấy / trích xuất dữ liệu từ một website nào đó về để phục vụ việc phân tích đánh giá. Một số use case phổ biến là nghe ngóng một website nào đó đang bàn tán chủ đề gì hot nhất hay lữu dữ liệu để thực hiện phân tích. Như thế các bạn cần một công cụ cho phép lấy dữ liệu về, bạn ko thể làm thủ công từng website với từng link một. Hiện có rất nhiều cách để làm việc này.

Thế nào là ngôn ngữ hay framework tốt nhất để Scraping?

Đây là một định nghĩa mơ hồ thuộc về định nghĩa thế nào là tốt? Đối với một số bạn cần lập trình nhanh là tốt, một số lại định nghĩa cần có performance cực khủng, hay một số lại quan trọng nhất là dễ maintenance / nâng cấp sau này nếu có. Vậy trước khi lựa chọn một ngôn ngữ hay framework nào để theo đuổi / triển khai, bạn nên xem nhu cầu của bạn là gì để lựa chọn phù hợp.

Sau đây là một số ý tưởng cho việc lựa chọn ngôn ngữ / framework Web Scraping:

  1. Flexibility (Sự linh hoạt) – Có hỗ trợ các API sẵn có phục vụ thao tác crawling dễ dàng.
  2. Efficiency  – Sự hiệu quả, tốc độ crawling.
  3. Ease of Coding – Dễ dàng cho dev có thể coding. Bao gồm cả triển khai.
  4. Scalability – Khả năng mở rộng ứng dụng khi crawling các web lớn hay lưu trữ / tốc độ truy cập (IO) vẫn đảm bảo.
  5. Maintainability – Dễ dàng bảo trì và phát triển sau này, tránh sử dụng các ngôn ngữ / framework có quá ít hỗ trợ từ cộng đồng hoặc các tính năng lỗi thời.

Tốc độ có phải là yếu tố then chốt?

Tôi cá là các bạn sẽ và tôi đều lo lắng vấn đề này, nếu crawl 10 websites cùng lúc thì tốc độ crawling mỗi website sẽ thế nào. Tốc độ là yếu tố then chốt để có một nền tảng tốt nhưng nó thường không phải là giới hạn của ngôn ngữ / framework, mà là giới hạn của tốc độ đọc ghi vào Database hay IOPS lưu trữ lên ổ cứng máy chủ. Cho nên ngoài việc là một lập trình viên giỏi, bạn cũng cần trang bị cho mình kiến thức về hệ thống.

Theo iGà, định nghĩa một bạn làm fullstack cần phải có kiến thức front-end, back-end và cả devops. iGà có làm việc với nhiều bạn developer gọi mình là fullstack nhưng các ứng dụng hỏi bạn triển khai như thế nào thì các bạn chỉ nhìn ứng dụng ở mức “em yêu khoa học”, làm cho có các tính năng chứ chưa nghĩ tới workload hay architect. Có thể iGà là người khó tính, yêu cầu cao.

Một số điểm thắt cổ chai (bottle-neck) mà bạn cần phải tính toán:

  1. Tốc độ Internet (Speed of Internet) – Bạn cần phân tích xem Source website mà bạn tính crawl dữ liệu nằm ở đâu. Ví Dụ website tính craw dữ liệu nếu nằm ở VN thì tốt nhất Crawler bạn nên triển khai ở VN. Trong trường hợp triển khai Crawler ở AWS Cloud bạn nên triển khai ở Singapore để có latency thấp nhất.
  2. Khối lượng dữ liệu bạn cần xử lý Crawl (Data Size) – Bạn cần ước lượng có bao nhiêu dữ liệu bạn cần crawl, data size cho mỗi lần crawl, loại dữ liệu (hình ảnh, video, text…) Nếu có sự khác nhau giữa nhiều loại dữ liệu / đối tượng đích (website 1, website 2…), bạn nên phân tải nhiều crawler, mỗi crawler làm một nhiệm vụ lấy dữ liệu và sync về một mối.
  3. Lưu trữ IOPS – Tốc độ đọc ghi là một vấn đề nhức nhối mà bạn phải đánh đổi giữa chi phí và tốc độ. Với dữ liệu hình ảnh bạn có thể chọn các phân vùng có IOPS cao như AWS EBS Provisioned IOPS hay lưu vào S3 thông qua các API Serverless Lambda.

Bạn nên kiểm tra workload ở tải nhỏ và tăng dần (pilot test) để điều chỉnh ứng dụng, hạ tầng AWS cho phù hợp. Một số dịch vụ hữu ích cho Web Scraping là Dynamo DB cho lưu trữ dữ liệu phi cấu trúc, S3 cho lưu trữ hình ảnh / video, Lambda Serverless để thao tác với dữ liệu crawler về.

Nói như trên thì không có nghĩa là ngôn ngữ lập trình không đóng vai trò hoặc nó ko quan trọng. Chọn ngôn ngữ lập trình / framework cũng không nằm ngoài các tiêu chí trên.

Ngôn ngữ lập trình và nền tảng tốt nhất cho Web Scraping

1. Node JS

NodeJS nằm đầu danh sách vì tính chất dễ học, phát triển các ứng dụng nhanh. Ngày nay bạn có thể tìm thấy rất nhiều khóa học miễn phí trên Youtube hay có phí trên Udemy. iGà nghĩ nếu bạn tập trung, chắc chỉ mất 01 tuần để làm xong. Nhưng NodeJS iGà không  khuyến nghị sử dụng cho các dự án lớn, đòi hỏi các xử lý nặng.

Điểm cộng: Speed of development

Điểm cân nhắc: large scale project (performance and stability issue).

2. C / C++

Ngay từ hồi học đại học ngôn ngữ này luôn được ưu tiên dạy dỗ, cách viết sáng sủa và hiệu năng cao. Nhưng chi phí hay tốc độ lập trình với C / C++ rất cao. Nếu công ty bạn ko phải nghiêm túc chỉ làm về Scraping thì không nên bắt đầu với C/C++ vì chi phí đội ngũ sẽ rất cao.

Điểm cộng: Performance

Điển cân nhắc: Speed of development,

3. Python

Python có lẽ là cân bằng giữa NodeJS và C/C++. Python hỗ trợ nhiều thư viện xử lý dữ liệu, tốc độ cao hơn NodeJS, code viết sáng sủa. Nhược điểm của Python chính là đã viết Python thì rất khó viết các ngôn ngữ khác (theo iGà) vì cách viết dễ dàng, dễ học. Python cũng là ngôn ngữ ưu thích của iGà vì đơn giản là ko có dấu chấm phẩy (khá là useless).

Python có 02 frameworks phổ biến để Scraping đó là: Scrapy và Beautiful Soup.

Scrapy có performance tốt nhờ sự hỗ trợ của Twisted Lib và XPath. Beautiful Soup là một thư viện của Python (Fast & Efficiency).

Kết luận

Python là hiện là ngôn ngữ đạt nhiều đánh giá tốt nhất trong thế giới Web Scraping. Tuy nhiên triển khai một giải pháp Crawling cũng đòi hỏi nhiều tính toán hơn nữa ví dụ bạn không nên Crawl dữ liệu web vào giờ cao điểm (off-peak hour), và interval (khoảng cách crawl) thế nào là hợp lý để không ảnh hưởng đến trải nghiệm khách hàng.

 

 

Topics #aws #crawl #dynamo #ebs #iops #lambda #S3 #scraping