Vnstock Logo

Mẫu Chương trình Cập nhật Tin tức

Cập nhật lần cuối:

Thảo luận

Mục lục

Giới thiệu

Phần này trình bày một mẫu chương trình hoàn chỉnh, tích hợp các tính năng của thư viện `vnstock_news` để xây dựng một hệ thống cập nhật tin tức tự động. Mẫu này bao gồm các bước từ việc cấu hình, thu thập dữ liệu, xử lý và lưu trữ.

Sử dụng nhanh

Sau khi cài đặt thư viện thành công, bạn có thể nhập câu lệnh đơn giản sau vào ứng dụng dòng lệnh Terminal (hoặc Command Prompt trên Windows) để kích hoạt chương trình mẫu mà không phải cài đặt bất kỳ tham số nào. Sau khi trải nghiệm và đánh giá các dữ liệu mẫu, bạn có thể tuỳ biến sâu hơn theo nhu cầu sử dụng của mình.

Shell
vnstock-news-crawler

Nếu sử dụng trong môi trường Google Colab hoặc Jupyter Notebook, nhập câu lệnh kèm dấu ! trước dòng lệnh.



Khởi động chương trình Vnstock News từ Terminal của macOS
Khởi động chương trình Vnstock News từ Terminal của macOS

Vnstock News sau đó tự động gửi các kết nối song song đến các trang tin để tăng tốc độ đọc nội dung và tối ưu hiệu năng chương trình. File dữ liệu sẽ được lưu trữ bằng định dạng CSV tại thư mục output/news tại thư mục dự án. Chương trình hiện tại tự động lên lịch cập nhật dữ liệu 15 phút/lần và lưu trữ dữ liệu vào thư mục mặc định.

Nội dung dữ liệu tin tức được chuẩn hoá từ Vnstock News
Nội dung dữ liệu tin tức được chuẩn hoá từ Vnstock News

Bạn đồng thời nhận được kết quả báo cáo tóm tắt tại file news_summary.txtnews_report.json để tuỳ ý sử dụng. Trong báo cáo tóm tắt sẽ thống kê số lượng bài báo đã truy cập, 20 chủ đề tin tức được nhắc đến nhiều nhất trong các nội dung đã tải về.

Shell
News Monitor Report - 2025-04-11 00:18
==================================================

STATISTICS
--------------------------------------------------
Total articles collected: 580
Articles in the last 24 hours: 0
New articles in last run: 549

BY SITE
--------------------------------------------------
cafef: 50 articles
cafebiz: 122 articles
vietstock: 99 articles
plo: 217 articles
ktsg: 22 articles
dddn: 39 articles

TRENDING TOPICS
--------------------------------------------------
1. việt nam: 107 mentions
2. thị trường: 76 mentions
3. thuế quan: 52 mentions
4. đối ứng: 52 mentions
5. thương mại: 50 mentions
6. chứng khoán: 49 mentions
7. thủ tướng: 46 mentions
8. hoãn thuế: 43 mentions
9. tổng thống: 43 mentions
10. trung quốc: 41 mentions
11. thuế đối: 41 mentions
12. thuế đối ứng: 41 mentions
13. doanh nghiệp: 40 mentions
14. sau khi: 39 mentions
15. triệu đồng: 35 mentions
16. quốc gia: 34 mentions
17. trung ương: 33 mentions
18. phát triển: 32 mentions
19. xây dựng: 31 mentions
20. nhà đầu: 30 mentions

Dưới đây là ví dụ thực tế trong giao diện Google Colab.

Tóm tắt kết quả chương trình khi kết nối và phân tích tin tức trên Google Colab
Tóm tắt kết quả chương trình khi kết nối và phân tích tin tức trên Google Colab

Cấu trúc chương trình

Một chương trình cập nhật tin tức điển hình sử dụng vnstock_news có thể bao gồm các thành phần sau:

  1. Cấu hình nguồn tin: Định nghĩa các trang web cần thu thập và các quy tắc phân tích (selectors).
  2. Thu thập danh sách bài viết: Lấy các URL bài viết mới nhất từ RSS hoặc Sitemap.
  3. Thu thập chi tiết bài viết: Truy cập từng URL và trích xuất nội dung chi tiết.
  4. Xử lý và làm sạch dữ liệu: Chuyển đổi nội dung sang định dạng mong muốn (Markdown), loại bỏ các phần không cần thiết.
  5. Lưu trữ dữ liệu: Lưu trữ dữ liệu đã thu thập vào cơ sở dữ liệu, file CSV, hoặc các hệ thống khác.
  6. Lập lịch và tự động hóa: Chạy chương trình định kỳ để cập nhật tin tức liên tục.

Mẫu code chương trình

Python
import pandas as pd
from datetime import datetime, timedelta
from vnstock_news.core.crawler import Crawler
from vnstock_news.core.batch import BatchCrawler
from vnstock_news.config.sites import SITES_CONFIG # Để truy cập cấu hình các trang
from vnstock_news.utils.logger import setup_logger
import time

# --- 1. Cấu hình chung ---
# Thiết lập logger để theo dõi quá trình
logger = setup_logger("NewsUpdateProgram", debug=True)

# Danh sách các trang bạn muốn thu thập
# Bạn có thể chọn từ SUPPORTED_SITES hoặc thêm cấu hình tùy chỉnh
TARGET_SITES = ['cafef', 'vnexpress', 'baodautu']

# Ngưỡng thời gian để chỉ lấy các bài viết mới (ví dụ: trong 24 giờ qua)
# news_since = datetime.now() - timedelta(days=1)

# --- 2. Hàm chính để cập nhật tin tức ---
def update_news(site_name: str, limit_articles: int = 10) -> pd.DataFrame:
    """
    Cập nhật tin tức cho một trang cụ thể.
    """
    logger.info(f"Bắt đầu cập nhật tin tức cho trang: {site_name}")
    all_articles_df = pd.DataFrame()

    try:
        # Khởi tạo Crawler để lấy danh sách URL
        crawler = Crawler(site_name=site_name)

        # Lấy danh sách các bài viết (chỉ metadata: URL, publish_time)
        # Crawler sẽ tự động ưu tiên RSS nếu có, sau đó là Sitemap
        article_metadata_list = crawler.get_articles(limit=limit_articles)

        if not article_metadata_list:
            logger.warning(f"Không tìm thấy bài viết nào từ {site_name}.")
            return pd.DataFrame()

        logger.info(f"Tìm thấy {len(article_metadata_list)} URL bài viết từ {site_name}. Bắt đầu thu thập chi tiết...")

        # Khởi tạo BatchCrawler để thu thập chi tiết các bài viết
        # BatchCrawler sẽ sử dụng cấu hình parser của site_name đã cho
        batch_crawler = BatchCrawler(site_name=site_name, request_delay=0.5) # Thêm độ trễ để tránh bị chặn

        # Thu thập chi tiết các bài viết theo lô
        detailed_articles_df = batch_crawler.fetch_details_for_urls(
            urls=[item['url'] for item in article_metadata_list] # Truyền danh sách URL đã lấy
        )

        if not detailed_articles_df.empty:
            all_articles_df = pd.concat([all_articles_df, detailed_articles_df], ignore_index=True)
            logger.info(f"Đã thu thập thành công {len(detailed_articles_df)} bài viết chi tiết từ {site_name}.")
        else:
            logger.warning(f"Không thu thập được bài viết chi tiết nào từ {site_name}.")

    except Exception as e:
        logger.error(f"Lỗi khi cập nhật tin tức từ {site_name}: {e}")

    return all_articles_df

# --- 3. Chạy chương trình chính ---
if __name__ == "__main__":
    logger.info("Chương trình cập nhật tin tức tự động bắt đầu.")
    
    all_fetched_data = pd.DataFrame()

    for site in TARGET_SITES:
        site_data = update_news(site, limit_articles=5) # Lấy 5 bài mới nhất từ mỗi trang
        if not site_data.empty:
            all_fetched_data = pd.concat([all_fetched_data, site_data], ignore_index=True)
        time.sleep(2) # Tạm dừng giữa các trang để tránh quá tải server

    if not all_fetched_data.empty:
        logger.info(f"Tổng cộng đã thu thập {len(all_fetched_data)} bài viết từ tất cả các trang.")
        
        # --- 4. Xử lý và lưu trữ dữ liệu (ví dụ) ---
        # Sắp xếp theo thời gian xuất bản
        if 'publish_time' in all_fetched_data.columns:
            all_fetched_data['publish_time'] = pd.to_datetime(all_fetched_data['publish_time'], errors='coerce')
            all_fetched_data = all_fetched_data.sort_values(by='publish_time', ascending=False)
        
        # Lưu vào CSV
        output_filename = f"news_update_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
        all_fetched_data.to_csv(output_filename, index=False)
        logger.info(f"Dữ liệu đã được lưu vào file: {output_filename}")
        
        # Hiển thị một vài dòng đầu
        print("\n--- Dữ liệu đã thu thập (5 dòng đầu) ---")
        print(all_fetched_data.head())
    else:
        logger.info("Không có dữ liệu nào được thu thập.")

    logger.info("Chương trình cập nhật tin tức tự động kết thúc.")

Tùy biến và mở rộng

  • Thêm trang mới: Để thêm một trang web mới, bạn cần tạo một cấu hình tương tự trong vnstock_news/config/sites.py hoặc cung cấp custom_config khi khởi tạo Crawler.
  • Lọc theo thời gian: Bạn có thể thêm logic lọc publish_time sau khi get_articles trả về để chỉ xử lý các bài viết trong một khoảng thời gian nhất định.
  • Xử lý lỗi nâng cao: Mẫu này có xử lý lỗi cơ bản. Trong ứng dụng thực tế, bạn có thể muốn triển khai các cơ chế thử lại (retry), backoff hoặc thông báo lỗi chi tiết hơn.
  • Lưu trữ dữ liệu: Thay vì CSV, bạn có thể lưu vào cơ sở dữ liệu (SQL, NoSQL), dịch vụ lưu trữ đám mây, hoặc các hệ thống khác.
  • Lập lịch: Sử dụng các thư viện lập lịch như schedule, APScheduler hoặc các công cụ hệ thống như cron (Linux) / Task Scheduler (Windows) để chạy chương trình định kỳ.

Mẫu chương trình này cung cấp một nền tảng vững chắc để bạn bắt đầu xây dựng hệ thống thu thập tin tức tùy chỉnh của riêng mình.

Thảo luận

Đang tải bình luận...