Mẫu Chương trình Cập nhật Tin tức
Cập nhật lần cuối:
Thảo luậnMục lục
Giới thiệu
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.
vnstock-news-crawlerNế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.

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.

Bạn đồng thời nhận được kết quả báo cáo tóm tắt tại file news_summary.txt và news_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ề.
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 mentionsDưới đây là ví dụ thực tế trong giao diệ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:
- 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).
- 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.
- 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.
- 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.
- 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.
- 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
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.pyhoặc cung cấpcustom_configkhi khởi tạoCrawler. - Lọc theo thời gian: Bạn có thể thêm logic lọc
publish_timesau khiget_articlestrả 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,APSchedulerhoặ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