Vnstock Logo

Theo dõi và đọc tin tức

Mở rộng

Mục lục

Thư viện vnstock_news thế hệ 5 tổ chức quy trình theo dõi tin tức thành hai thao tác rõ ràng, phục vụ từng nhu cầu cụ thể của bạn:

  1. Lấy danh sách tin mới (fetch_feeder): Đọc nhanh nguồn cấp tin RSS hoặc sơ đồ trang XML Sitemap do trang tin công bố để nhận bảng tổng hợp tiêu đề, tóm tắt, thời gian xuất bản và đường dẫn liên kết bài viết. Thao tác này diễn ra rất nhanh, phù hợp để theo dõi diễn biến thị trường theo phiên.
  2. Đọc chi tiết bài viết (fetch_articles): Mở từng trang bài viết để đọc các trường thông tin như tác giả, chuyên mục, từ khoá (tags), lượt xem, ảnh đại diện, và nội dung bài viết (dạng Markdown) khi bạn tự cung cấp bộ chọn nội dung (content_selector) cho nghiên cứu cá nhân.
Điều kiện tài khoản

Cả hai hàm fetch_feeder() và fetch_articles() đều áp dụng cho tài khoản bản Mở rộng từ cấp Silver trở lên (Silver, Golden, Diamond). Tính năng truyền nguồn tự chọn (sources), danh sách liên kết có sẵn (urls) hoặc cấu hình riêng (config) cũng yêu cầu cấp Silver trở lên.


1. Lấy danh sách tin mới với fetch_feeder()

Hàm fetch_feeder() phù hợp khi bạn cần cập nhật nhanh các bài viết mới đăng mà chưa cần tải toàn bộ nội dung trang bài.

Chữ ký hàm

Python
fetch_feeder(
    site_name: str | None = None,
    sources: list[str] | None = None,
    top_n_per_feed: int | None = None,
    within: str | None = None,
    top_n: int | None = None,
    sort_order: str = "desc",
    description_format: str = "text",
    max_concurrency: int = 5,
) -> pd.DataFrame

Bảng tham số fetch_feeder()

Tham sốKiểuMặc địnhCách dùng cho bạn
site_namestr | NoneNoneTên mã của website tin tức trong danh mục (ví dụ: "cafef", "vnexpress", "vietstock"). Xem danh sách đầy đủ tại Danh mục nguồn tin.
sourceslist[str] | NoneNoneDanh sách đường dẫn RSS Feed hoặc XML Sitemap do bạn tự chọn. Khi truyền tham số này, thư viện sẽ ưu tiên lấy tin từ các nguồn này thay vì site_name.
withinstr | NoneNoneLọc bài viết đăng trong khoảng thời gian tính lùi từ hiện tại: "30m" (30 phút qua), "2h" (2 giờ qua), "12h" (nửa ngày qua), "1d" (1 ngày qua). Bỏ trống nếu muốn lấy tất cả bài đang có trên nguồn.
top_nint | NoneNoneGiới hạn số lượng bài viết giữ lại trong bảng kết quả sau khi sắp xếp (ví dụ chỉ lấy 20 tin mới nhất).
top_n_per_feedint | NoneNoneGiới hạn số tin tối đa lấy từ mỗi nguồn cấp tin thành phần trước khi gộp chung lại.
sort_orderstr"desc"Thứ tự hiển thị theo thời gian: "desc" (mới nhất xếp trên) hoặc "asc" (cũ hơn xếp trước).
description_formatstr"text"Định dạng phần tóm tắt nội dung: "text" (văn bản thuần sạch thẻ HTML), "html" hoặc "markdown".
max_concurrencyint5Số lượng kết nối song song khi tải tin (mặc định 5, tối đa 16), giúp bạn nhận kết quả nhanh chóng mà vẫn điều phối nhịp độ an toàn.

Dữ liệu trả về từ fetch_feeder()

Tên cột tuỳ loại nguồn mà trang tin công bố. Trang có nguồn cấp tin RSS cho tiêu đề và tóm tắt; trang chỉ có sơ đồ trang (sitemap) chỉ cho đường dẫn và thời điểm cập nhật, không có tiêu đề.

Tên cộtCó ở nguồnKiểu dữ liệuÝ nghĩa
linkRSSstringĐường dẫn tới bài gốc.
titleRSSstringTiêu đề bài viết.
descriptionRSSstringĐoạn tóm tắt (sapo), dạng theo description_format.
pubDateRSSdatetime64[ns]Thời gian đăng, hiển thị theo giờ Việt Nam (UTC+07:00).
urlSơ đồ trangstringĐường dẫn tới bài gốc.
lastmodSơ đồ trangdatetime64[ns]Thời điểm trang tin cập nhật bài, theo giờ Việt Nam. Chỉ có khi sơ đồ trang ghi mốc này.
feed_sourceMọi nguồnstringĐường dẫn nguồn cấp tin hoặc sơ đồ trang đã cho ra dòng này.
feed_timeMọi nguồnstringThời điểm thực hiện lệnh lấy tin.

Với một trang trong danh mục, thư viện đọc loại nguồn đầu tiên có sẵn theo thứ tự ưu tiên của trang đó. Ở danh mục hiện tại, vietstock, cafebiz, vnexpress, tuoitre, dantri cho bảng dạng RSS; các trang còn lại, trong đó có cafef, cho bảng dạng sơ đồ trang. Khi viết mã dùng được cho cả hai loại, hãy kiểm tên cột trước khi dùng:

Python
link_col = "link" if "link" in df.columns else "url"
time_col = "pubDate" if "pubDate" in df.columns else "lastmod"

2. Đọc chi tiết bài viết với fetch_articles()

Khi bạn cần trích xuất sâu hơn các trường thông tin của bài viết (tác giả, chuyên mục, từ khoá tags, lượt xem, ảnh đại diện) hoặc đọc nội dung bài viết theo bộ chọn bạn cung cấp, hãy sử dụng hàm fetch_articles().

Chữ ký hàm

Python
fetch_articles(
    site_name: str | None = None,
    sources: list[str] | None = None,
    urls: list[str] | None = None,
    config: dict[str, Any] | None = None,
    top_n: int | None = 10,
    top_n_per_feed: int | None = None,
    within: str | None = None,
    sort_order: str = "desc",
    max_concurrency: int = 5,
) -> pd.DataFrame

Bảng tham số fetch_articles()

Tham sốKiểuMặc địnhCách dùng cho bạn
site_namestr | NoneNoneTên website trong danh mục (ví dụ: "cafef"). Thư viện dùng bộ chọn có sẵn của trang để đọc tiêu đề, ngày đăng, tác giả, chuyên mục. Danh mục không có bộ chọn nội dung, nên cột content để trống.
sourceslist[str] | NoneNoneDanh sách đường dẫn feed hoặc sitemap tự chọn để duyệt danh sách bài viết trước khi đọc từng trang.
urlslist[str] | NoneNoneDanh sách đường dẫn bài viết cụ thể cần mở trực tiếp, bỏ qua bước duyệt danh mục. Khi truyền urls, các tham số top_n, within, sort_order không áp dụng.
configdict | NoneNoneCấu hình bộ chọn do bạn tự định nghĩa (gồm title_selector, content_selector, ...). Cách dựng từ một bài mẫu xem tại trang Tuỳ biến Sitemap và RSS.
top_nint | None10Số bài viết tối đa cần đọc chi tiết sau khi sắp xếp. Đặt None nếu muốn mở toàn bộ bài tìm được.
top_n_per_feedint | NoneNoneGiới hạn số bài lấy từ mỗi nguồn cấp tin trước khi gộp.
withinstr | NoneNoneKhoảng thời gian lọc bài viết: "30m", "2h", "12h", "1d".
sort_orderstr"desc"Thứ tự sắp xếp theo thời gian ("desc" hoặc "asc").
max_concurrencyint5Số yêu cầu chạy song song (tối đa 16). Mỗi website nguồn chỉ nhận tối đa 2 yêu cầu đồng thời và cách nhau ít nhất 1 giây để giữ tải hợp lý cho trang tin.

Cấu trúc 14 trường dữ liệu chuẩn hoá

Bảng DataFrame trả về từ fetch_articles() gồm 14 cột chuẩn hoá theo đúng thứ tự:

STTTên cộtKiểu dữ liệuÝ nghĩa
1urlstringĐường dẫn liên kết trực tiếp tới bài viết gốc.
2titlestringTiêu đề bài viết (khoảng trắng được nối chuẩn theo hiển thị thực tế).
3short_descriptionstringĐoạn văn tóm tắt bài viết (sapo).
4contentstringNội dung bài viết dạng Markdown (được trích xuất khi bạn tự cung cấp content_selector).
5publish_timedatetime64[ns]Thời gian xuất bản, tự động chuyển đổi về múi giờ Việt Nam (UTC+07:00).
6authorstringTên tác giả hoặc đơn vị dẫn nguồn.
7categorystringChuyên mục tin tức của bài viết.
8tagsstringCác từ khoá / nhãn phân loại của bài viết, ngăn cách bởi dấu phẩy.
9view_countsInt64Số lượt xem bài viết (nếu trang tin có công bố).
10image_urlstringĐường dẫn ảnh đại diện của bài viết.
11sourcestringTên định danh nguồn tin (ví dụ: "cafef").
12feed_sourcestringNguồn cấp tin đã phát hiện bài viết này.
13feed_timestringThời gian đọc nguồn cấp tin.
14site_namestringTên website tương ứng của bài viết.
Lưu ý về bản quyền và cột content

Thế hệ 5 không kèm sẵn cách đọc nội dung bài cho bất kỳ trang tin nào: danh mục có sẵn không có bộ chọn nội dung (content_selector), nên fetch_articles(site_name=...) luôn để trống cột content. Nội dung bài viết thuộc về toà soạn. Nếu cần nội dung cho nghiên cứu cá nhân ở trang mà robots.txt và điều kiện sử dụng cho phép, bạn tự viết cấu hình theo hướng dẫn Tự dựng cấu hình đọc nội dung từ một bài mẫu, và không đăng lại nội dung đó ở nơi khác.

Xử lý thông minh văn bản và thời gian

  • Nối từ tự nhiên: Động cơ bóc tách mới tôn trọng khoảng trắng hiển thị, tránh tình trạng dính liền chữ khi gặp các thẻ HTML con (ví dụ: Giá <b>vàng</b> tăng được đọc chuẩn thành "Giá vàng tăng").
  • Nhận diện thời gian tiếng Việt: Tự động chuyển đổi các định dạng thời gian tương đối ("2 giờ trước", "hôm qua") và ngày giờ tiếng Việt ("Thứ Sáu, 10/10/2026, 08:05") về chuẩn thời gian chính xác theo giờ Việt Nam.

3. Các ví dụ sử dụng thực tế

Ví dụ 1: Lấy nhanh tin tức trước phiên giao dịch với fetch_feeder()

Lấy 20 tin mới nhất trong vòng 2 giờ qua từ Vietstock (trang công bố RSS, nên có tiêu đề) để cập nhật thông tin vĩ mô đầu ngày:

Python
import vnstock_news

df = vnstock_news.fetch_feeder(
    site_name="vietstock",
    within="2h",
    top_n=20
)

print(f"Có {len(df)} tin mới trong 2 giờ qua:")
for _, row in df.iterrows():
    print(f"[{row['pubDate']:%H:%M}] {row['title']}")
    print(f"-> Đọc bài: {row['link']}\n")

Với trang chỉ có sơ đồ trang như CafeF, bảng không có tiêu đề; bạn dùng url và lastmod:

Python
df = vnstock_news.fetch_feeder(site_name="cafef", within="2h", top_n=20)
print(df[["lastmod", "url"]])

Ví dụ 2: Đọc chi tiết thông tin bài viết từ website trong danh mục

Dùng fetch_articles() để lấy siêu dữ liệu chi tiết (tác giả, chuyên mục, từ khoá tags, ảnh đại diện):

Python
import vnstock_news

# Đọc 5 bài viết mới nhất từ Vietstock
df_articles = vnstock_news.fetch_articles(
    site_name="vietstock",
    top_n=5
)

print(f"Đã đọc {len(df_articles)} bài viết:")
print(df_articles[["title", "author", "category", "tags", "publish_time"]])

Ví dụ 3: Đọc trực tiếp từ danh sách đường dẫn bài viết có sẵn

Khi bạn đã có sẵn danh sách đường dẫn bài viết (ví dụ lọc từ bảng fetch_feeder()), bạn truyền thẳng vào tham số urls:

Python
import vnstock_news

df_feed = vnstock_news.fetch_feeder(site_name="cafef", within="6h", top_n=10)
my_urls = df_feed["url"].head(3).tolist()   # CafeF là sơ đồ trang: cột đường dẫn tên là url

df_details = vnstock_news.fetch_articles(
    site_name="cafef",
    urls=my_urls
)

print(df_details[["title", "publish_time", "author"]])