Trong thời đại kỷ nguyên số như hiện nay, ai cũng biết rằng dữ liệu internet là một nguồn data dồi dào và phong phú nhất. Mà dữ liệu thì lại chẳng khác gì vàng cả. Người ta còn đo sự giàu có của một công ty dựa trên lượng dữ liệu mà công ty đó có cơ mà. Hãy thử điểm qua các công ty công nghệ xem họ có bao nhiêu dữ liệu?
Ví dụ như Facebook, Tiktok hay Twitter, hay như Zalo của Việt Nam. Mục tiêu hàng đầu của họ là tăng số lượng người dùng. Khi họ có nhiều người dùng (nhiều data đó) thì họ có thể dễ dàng kiếm tiền bằng quảng cáo. Vậy nên họ mới nói công ty to là công ty nắm trong tay nhiều dữ liệu chứ.
Nói vĩ mô quá, quay lại vấn đề chính nào. Trong bài hướng dẫn này, mình sẽ chỉ cho bạn cách để kiếm dữ liệu từ các trang tin tức, báo điện tử một cách dễ dàng nhất. Đúng như tiêu đề bài viết này, bạn chỉ mất 5 dòng code để lấy được toàn bộ dữ liệu của một bài báo bất kỳ. Đi vào bài toán thôi nào!
Khoe thành phẩm trước nhé
Để các bạn hứng thú nghiên cứu hơn, mình đã cài sẵn một service nho nhỏ để các bạn test rồi nè.
Bạn có thể thử trực tiếp tại đây:
Nó có thể crawl dữ liệu của một trang tin tức bất kỳ nào, từ Vnexpress, Dantri, ZingNews, … tới cả các trang tin tức nước ngoài hay thậm chí là trang blog Lập Trình Không Khó này nữa. Các bạn trải nghiệm nhẹ tay nhé, sập server của mình là toi đó.
Mình cũng đã từng chia sẻ một số bài viết khác về crawl dữ liệu sử dụng Selenium, bạn nào quan tâm qua đây đọc nhé.
Lưu ý đối với độc giả
Bài viết này nhằm mục đích chia sẻ kiến thức, các bạn không nên dùng nó vào các mục đích xấu. Và nếu bạn đang cần dữ liệu, thì cũng đừng crawl quá nhanh tránh ảnh hưởng đến trang đích nhé.
Và cuối cùng, nếu bạn cần dữ liệu tin tức tiếng Việt, bạn có thể tham khảo một số nguồn dữ liệu tin tức tiếng Việt được public dưới đây, thay vì phải đi kéo từng bài cho mệt ra 🙂
- A Large-scale Vietnamese News Text Classification Corpus
- Corpus tin tức tiếng việt
- Dữ liệu wikipedia tiếng Việt, có cả các ngôn ngữ khác nhé, cứ google wiki dump data.
Mình crawl dữ liệu như thế nào?
Ý tưởng: Crawl HTML của cái URL cần lấy dữ liệu. Sau khi có HTML, bằng cách nào đó (thuật toán) bạn phải xác định được đâu là phần nội dung bài viết của đống HTML đó. Có 1 vài idea giúp ta phân biệt như sau:
- Phần nội dung bài viết có tỉ lệ text trên HTML code rất cao. Vì nội dung thì phải nhiều văn bản là đương nhiên rồi.
- Có nhiều thẻ
<p>
, là các thẻ đoạn văn - Thường nó nằm phía dưới thẻ
<h1>
, tiêu đề của bài
Nếu có điều kiện các bạn hãy thử cài đặt thuật toán này để tự xác định ra vùng nào là vùng nội dung của một bài viết nhé. Còn trong bài này thì mình dùng 1 thư viện có sẵn của Python rồi. Họ cũng dùng ý tưởng này để xác định phần nội dung bài viết thôi.
Mình sử dụng ngôn ngữ Python ở đây. Bởi vì nó có hàng tá thư viện giúp chúng ta từ request lấy HTML, rồi bóc tách nội dung từ HTML, và cả bóc tách nội dung của một trang báo nữa… Quan trọng nhất, mình hay dùng Python và cũng không đến nỗi gà Python lắm.
5 dòng code thần thánh
Vì là có thư viện sẵn rồi, nên chúng ta chỉ việc dùng nó thôi. Thư viện dùng để crawl dữ liệu và bóc tách nội dung của một trang tin tức bất kỳ mà mình muốn nói đến ở đây là newspaper.
Các bạn hãy sử dụng Python 3, và cài đặt thư viện này qua pip nhé:
$ pip3 install newspaper3k
Và để crawl dữ liệu của một url bất kỳ, hãy dùng 5 dòng code sau đây:
from newspaper import Article url = 'https://vnexpress.net/12-000-nguoi-do-ve-cua-lo-4092705.html' article = Article(url) article.download() article.parse() # Xong rồi đấy, giờ lấy data thôi print(article.title) > 12.000 người đổ về Cửa Lò - VnExpress ...
Thư viện này có thể làm được gì cho bạn?
- Hỗ trợ chạy đa luồng (multi-thread)
- Trích xuất văn bản từ mã HTML
- Lấy danh sách ảnh(bao gồm cả ảnh đại diện) của bài báo
- Trích xuất từ khóa và các meta data (description, published data, og:title,…)
- Và một số thông tin khác, nhưng hầu như nó không work với tiếng Việt.
Chi tiết cách sử dụng, tài liệu bạn xem thêm tại repo github của newspaper nhé.
Mình làm trang demo kia như thế nào?
Việc crawl chỉ có 5 dòng code mình đã để ở trên đó rồi, việc dùng như nào là của các bạn nhé. Còn trang demo mà các bạn vừa trải nghiệm (chưa trải nghiệm thì lên trải nghiệm đi đã nhé) thì mình dùng thêm một ít kỹ thuật viết service thôi. Có một số technique mình sử dụng sau đây:
- Flask, một framework web của Python, mình có mấy bài hướng dẫn về nó ở đây nè.
- Và một ít kiến thức về VPS, Bash shell, Nginx + có 1 tên miền để cấu hình cho mọi người truy cập được qua domain. Còn không thì chỉ mình bạn chạy và dùng được, hoặc bạn có thể deploy lên dịch vụ miễn phí Heroku nhé.
- Source code của trang demo có tại đây nhé, follow mình nếu bạn thấy nó hay nha ^^
Ok, vậy là mình đã giúp bạn crawl dữ liệu của website tin tức bất kỳ chỉ với 5 dòng code. Quá đơn giản phải không nào.
Hướng phát triển tiếp theo
Đến đây, việc lấy thông tin của một url tin tức bất kỳ không còn là khó khăn nữa rồi. Và để lấy được dữ liệu của một web tin tức thì bạn có thể làm theo hướng sử dụng thuật toán tìm kiếm theo chiều rộng bằng cách tại mỗi trang bạn duyệt qua, tìm tất cả các url trỏ tới bài viết, chuyên mục khác mà bạn chưa duyệt. Bằng cách này bạn có thể crawl cả website.
Tuy nhiên, thực tế luôn phũ phàng, bạn sẽ gặp phải hàng tá vấn đề như bị chặn request, block ip, hoặc có các trang họ giới hạn số request,…
Ngoài ra, phương pháp kể trên không làm việc với các trang load dữ liệu dùng JS. Đối với các trang loại này, ta cần phương pháp khác, dùng Selenium chẳng hạn, hoặc tìm ra API của họ,… Nhìn chung phải tùy theo mỗi trang web ta lại phải sử dụng các kỹ thuật khác nhau. Nhưng đa phần các trang tin tức không dùng JS để load nội dung.
Mình có một repo crawl dữ liệu social tiếng Việt, nếu bạn cần có thể tham khảo tại https://github.com/nguyenvanhieuvn/social-scraper.
Cảm ơn các bạn đã đọc bài viết!
Để lại một bình luận