Vnstock Logo

Hướng dẫn Cơ bản

Mở rộng

Mục lục

Tài liệu bản cũ: vnstock_news v2.2.2

Bản mặc định hiện là vnstock_news v3.1.1, gộp bản Cộng đồng và bản Mở rộng vào một thư viện. Trang này giữ lại cho máy còn cài vnstock_news v2.2.2: mã viết theo trang này vẫn chạy với bản đó. Đã cài bản mới thì đọc trang tương ứng của v3.1.1.

Máy đang cài bản nào: chạy python -c "import vnstock; print(vnstock.__version__)", ra số bắt đầu bằng 5. là thế hệ 5.

Phương pháp sử dụng
Các hàm và thông số bên dưới cung cấp kiến thức nền tảng về thư viện. Bạn cũng có thể tham khảo tài liệu Agent Guide để hỗ trợ các công cụ AI Agent viết kịch bản theo dõi tin tức theo yêu cầu.

1. Chi Tiết Các Lớp Xử Lý & Phương Thức

Thư viện vnstock_news cung cấp 4 lớp xử lý cho các cách đọc tin khác nhau:

1.1 Crawler - Giao diện cơ bản

Lớp Crawler là giao diện cơ bản, phù hợp với nhu cầu lấy bài viết mới từ RSS hoặc kiểm tra cấu hình trang tin:

Khởi tạo:

Python
from vnstock_news import Crawler

# Cách 1: Sử dụng cấu hình có sẵn của nguồn tin (ví dụ: vnexpress, tuoitre, cafef)
client = Crawler(site_name="vnexpress")

# Cách 2: Truyền cấu hình tùy chỉnh cho trang web mới
custom_site_config = {
    "name": "Trang tin mẫu",
    "domain": "trangtin.example",
    "rss_urls": ["https://trangtin.example/rss/feed.xml"],
    "sitemap_url": "https://trangtin.example/sitemap.xml",
    "config": {
        "title_selector": {"tag": "h1", "class": "title-detail"}
    }
}
client_custom = Crawler(custom_config=custom_site_config)

Phương thức chính:

  • get_articles_from_feed(limit_per_feed=20): Lấy danh sách bài viết từ các kênh RSS Feed.
  • get_articles(sitemap_url=None, limit=10, limit_per_feed=None): Ưu tiên lấy từ RSS Feed, nếu không có RSS sẽ chuyển sang lấy danh sách URL từ Sitemap.

Bảng tham số Crawler:

Tham SốKiểu Dữ LiệuMặc ĐịnhMô Tả
site_namestrNoneTên định danh của website trong SITES_CONFIG (ví dụ: "vnexpress", "cafef")
custom_configdictNoneDictionary chứa cấu hình bộ chọn và nguồn RSS/Sitemap tự định nghĩa
limit_per_feedint20Số lượng bài viết tối đa cần lấy từ mỗi nguồn RSS feed
limitint10Tổng số lượng bài viết truy xuất khi gọi get_articles()
sitemap_urlstr / listNoneĐường dẫn Sitemap XML tùy chỉnh

1.2 BatchCrawler - Đọc bài tuần tự có khoảng nghỉ

BatchCrawler đọc chi tiết từng bài viết lần lượt theo cơ chế đồng bộ, có khoảng nghỉ request_delay giữa các yêu cầu, và hỗ trợ lưu dữ liệu tạm để tiếp tục tiến trình nếu bị gián đoạn.

Ví dụ sử dụng:

Python
from vnstock_news import BatchCrawler

# Khởi tạo BatchCrawler với khoảng trễ 1.5 giây giữa các yêu cầu
client = BatchCrawler(
    site_name="cafef",
    request_delay=1.5,
    output_path="./output_data"
)

# Tải nội dung chi tiết của 100 bài viết từ Sitemap
df_articles = client.fetch_articles(limit=100)
print(f"Tổng số bài viết đã bóc tách: {len(df_articles)}")

Bảng tham số BatchCrawler:

Tham SốKiểu Dữ LiệuMặc ĐịnhMô Tả
site_namestrBắt buộcTên định danh website trong hệ thống cấu hình
request_delayfloat1.0Thời gian tạm dừng (giây) giữa các lần gửi yêu cầu HTTP
output_pathstr"./data"Thư mục lưu trữ tập tin tạm
limitint10Số lượng bài viết tối đa cần bóc tách chi tiết
sitemap_urlstr / listNoneURL sitemap cụ thể cần quét dữ liệu
debugboolFalseBật/tắt chế độ ghi log chi tiết

1.3 AsyncBatchCrawler - Đọc bài bất đồng bộ

AsyncBatchCrawler sử dụng thư viện aiohttp và asyncio để xử lý có kiểm soát số yêu cầu đồng thời, giới hạn bằng tham số max_concurrency. Bạn nên giữ mức đồng thời thấp để không gây tải cho trang nguồn.

Ví dụ sử dụng:

Python
import asyncio
from vnstock_news import AsyncBatchCrawler

async def run_async_pipeline():
    client = AsyncBatchCrawler(
        site_name="tuoitre",
        max_concurrency=3  # Giới hạn tối đa 3 yêu cầu gửi đi đồng thời
    )
    
    # Lấy 50 bài viết từ Sitemap của một trang minh hoạ
    df_result = await client.fetch_articles_async(
        sources=["https://trangtin.example/news-sitemap.xml"],
        top_n=50
    )
    return df_result

df_tuoitre = asyncio.run(run_async_pipeline())
print(f"Truy xuất thành công {len(df_tuoitre)} bài viết.")

Bảng tham số AsyncBatchCrawler:

Tham SốKiểu Dữ LiệuMặc ĐịnhMô Tả
site_namestrBắt buộcTên định danh website nguồn
max_concurrencyint5Số yêu cầu đồng thời tối đa; nên giữ ở mức thấp
sourceslistBắt buộcDanh sách đường dẫn Sitemap XML nguồn
top_nint10Số lượng bài viết tối đa cần bóc tách từ danh sách URLs

1.4 EnhancedNewsCrawler - Lớp đọc tin mở rộng

EnhancedNewsCrawler tích hợp bộ nhớ đệm (Cache), cơ chế làm sạch văn bản, kiểm tra tính hợp lệ dữ liệu và tự động thử lại khi gặp lỗi kết nối tạm thời.

Ví dụ sử dụng:

Python
import asyncio
from vnstock_news import EnhancedNewsCrawler

async def run_enhanced_pipeline():
    client = EnhancedNewsCrawler(
        cache_enabled=True,
        cache_ttl=86400,    # Thời gian lưu bộ nhớ đệm 24 giờ
        max_concurrency=3
    )
    
    df_data = await client.fetch_articles_async(
        sources=["https://trangtin.example/latest-news-sitemap.xml"],
        site_name="example",
        max_articles=50,
        clean_content=True  # Tự động loại bỏ các thẻ HTML thừa và quảng cáo
    )
    return df_data

df_enhanced = asyncio.run(run_enhanced_pipeline())

2. So Sánh Hai Kênh Cấp Tin: RSS Feeds và Sitemap XML

Việc chọn kênh đọc tin phụ thuộc vào mục đích sử dụng cụ thể:

Tiêu Chí So SánhRSS Feeds (Tin Mới)Sitemap XML (Lịch Sử)
Tốc độ đọcNhanhPhụ thuộc số bài và thời gian trễ
Phạm vi dữ liệuChứa các bài mới phát hành gần đâyChứa danh sách bài viết theo thời gian lưu trữ của website nguồn
Độ sâu thông tinCó sẵn thông tin tóm tắt và ngày đăngCần gửi thêm yêu cầu HTTP để đọc chi tiết từng bài
Mục đích sử dụngCập nhật tin tức mới, nhận thông báo tin bàiTra lại bài đã đăng cho nghiên cứu cá nhân
Cơ chế dự phòngTự động chuyển sang Sitemap nếu RSS không hoạt độngTự động phân giải các Sitemap động theo tháng/năm

Gợi ý: Bạn có thể kết hợp sử dụng RSS Feeds để cập nhật bài viết mới định kỳ và đọc Sitemap XML để bổ sung các bài viết cần nghiên cứu thêm.


3. Cấu Trúc Dữ Liệu Trả Về

Thông tin bài viết sau khi đọc được trả về dưới dạng Pandas DataFrame hoặc List[Dict] với 11 trường dữ liệu chuẩn hóa:

Cột Dữ LiệuKiểu Dữ LiệuMô Tả Chi TiếtVí Dụ Dữ Liệu Mẫu
urlstrĐường dẫn URL của bài viết"https://trangtin.example/thi-truong-chung-khoan-2026.chn"
titlestrTiêu đề bài viết"Thị trường chứng khoán bật tăng mạnh phiên đầu tuần"
short_descriptionstrĐoạn tóm tắt / Sapo bài viết"Dòng tiền khối ngoại quay trở lại mua ròng..."
contentstrNội dung văn bản (đã loại bỏ HTML)"Nội dung chi tiết các đoạn văn bản trong bài..."
publish_timedatetimeThời gian xuất bản (dạng ISO)2026-04-15 09:30:00
authorstrTên tác giả hoặc nguồn dẫn"Nguyễn Văn A" / "Theo CafeF"
categorystrChuyên mục tin tức"Chứng khoán" / "Tài chính vĩ mô"
tagsstrDanh sách từ khóa / Tags bài viết"VN-Index, Chứng khoán, Lãi suất"
view_countsintSố lượt xem (nếu trang tin có hiển thị)15200
image_urlstrĐường dẫn ảnh đại diện bài viết"https://cdn.trangtin.example.vn/thumb_w/640/image.jpg"
sourcestrTên định danh nguồn tin"example"

Dữ liệu trả về ở dạng Pandas DataFrame giúp bạn dễ dàng thực hiện lọc, nhóm, lưu trữ ra tập tin CSV/Parquet hoặc nạp vào các quy trình xử lý dữ liệu tiếp theo.