Vnstock Logo

Chuyển đổi từ bản cũ

Mở rộng

Mục lục

Nếu bạn đang có các đoạn mã theo dõi tin tức viết cho vnstock_news phiên bản 2.x, thế hệ 5 hỗ trợ hai lộ trình chuyển đổi linh hoạt tuỳ theo nhu cầu của bạn:

  1. Giữ nguyên mã cũ (Tương thích ngược 1:1): Thư viện cung cấp đầy đủ các lớp tương thích (Crawler(), BatchCrawler(), AsyncBatchCrawler(), EnhancedNewsCrawler(), Cache, ContentCleaner, InputValidator) chạy trên lõi xử lý mới. Bạn có thể tiếp tục chạy mã nguồn cũ mà không phải viết lại từ đầu.
  2. Rút gọn mã mới (Khuyến nghị): Chuyển đổi sang hai hàm tinh gọn fetch_feeder() (lấy danh sách tin mới) và fetch_articles() (đọc chi tiết bài viết) để mã nguồn đồng bộ, ngắn gọn và dễ bảo trì hơn.

Những cải tiến ở thế hệ 5

  • Sửa lỗi lệch giờ: Ở bản 2.x, do bỏ qua độ lệch múi giờ trong RSS nên khi bạn lọc within="1h", kịch bản thường lấy nhầm bài viết của 8 tiếng trước. Thế hệ 5 đã sửa lỗi này và lọc theo múi giờ Việt Nam (UTC+07:00).
  • Nối từ tự nhiên, không dính chữ: Khắc phục lỗi nối liền chữ của bản cũ (như Giávàngtăng nay được đọc chuẩn thành Giá vàng tăng).
  • Tự động nhận diện thời gian tiếng Việt: Tự động chuyển đổi các định dạng tương đối như "5 phút trước", "hôm qua" về ngày giờ chuẩn xác.
  • Bảo mật và an toàn kết nối: Xác thực TLS luôn được bật mặc định, chặn các chuyển hướng không an toàn.
  • Hằng số cấu hình sẵn ở gói gốc: Các hằng số SITES_CONFIG, SUPPORTED_SITES nay có thể import trực tiếp từ vnstock_news thay vì phải truy cập sâu vào module nội bộ.

Bảng đối chiếu mã lệnh (Bản cũ → Thế hệ 5)

Thao tácBản cũ (2.x)Thế hệ 5 (3.x) - Lớp tương thíchThế hệ 5 (3.x) - Hàm mới khuyến nghị
Xem danh sách nguồnvnstock_news.list_supported_sites()vnstock_news.list_supported_sites()vnstock_news.list_supported_sites()
Lấy danh sách tin mớiCrawler(site_name="cafef").get_articles_from_feed()Giữ nguyên lớp Crawlervnstock_news.fetch_feeder(site_name="cafef", ...)
Đọc bài viết theo lôBatchCrawler(site_name="cafef").fetch_articles()Giữ nguyên lớp BatchCrawlervnstock_news.fetch_articles(site_name="cafef", ...)
Đọc bài bất đồng bộAsyncBatchCrawler(...).fetch_articles_async()Giữ nguyên AsyncBatchCrawlervnstock_news.fetch_articles(..., max_concurrency=5)
Đọc có cache & làm sạchEnhancedNewsCrawler(...)Giữ nguyên EnhancedNewsCrawlerfetch_articles() kết hợp Cache
Kiểm tra trạng tháiKhông cóKhông cóvnstock_news.status()
Bắt lỗiexcept Exception: chung chungfrom vnstock_news import NewsError
except NewsError as err:
from vnstock_news import NewsError
except NewsError as err:

Ví dụ chuyển đổi cụ thể

Lộ trình 1: Giữ nguyên mã cũ với lớp tương thích

Bạn chỉ cần import trực tiếp từ vnstock_news, mã nguồn cũ sẽ tự động tận dụng lõi xử lý tốc độ cao:

Python
# Mã cũ vẫn chạy bình thường trên thế hệ 5:
from vnstock_news import Crawler, AsyncBatchCrawler, SITES_CONFIG

# Khởi tạo lớp Crawler() tương thích bản cũ
client = Crawler(site_name="cafef")
articles = client.get_articles_from_feed(limit_per_feed=15)
print(f"Lấy được {len(articles)} tin mới từ feed.")

# Hằng số SITES_CONFIG đã có sẵn ở gốc thư viện
print("Số nguồn tin hỗ trợ:", len(SITES_CONFIG))

Lộ trình 2: Rút gọn sang hai hàm tinh gọn thế hệ 5

Chuyển đổi sang fetch_feeder() và fetch_articles() giúp loại bỏ mã lặp và đơn giản hoá đáng kể:

Python
import vnstock_news

# 1. Lấy danh sách liên kết tin mới.
#    CafeF chỉ công bố sơ đồ trang (sitemap), nên bảng có cột url và lastmod, không có tiêu đề.
df_feed = vnstock_news.fetch_feeder(
    site_name="cafef",
    within="6h",
    top_n=20
)
print(df_feed[["lastmod", "url"]].head())

#    Trang có nguồn cấp tin RSS (như Vietstock) cho thêm tiêu đề và tóm tắt.
df_rss = vnstock_news.fetch_feeder(site_name="vietstock", within="6h", top_n=20)
print(df_rss[["pubDate", "title", "link"]].head())

# 2. Đọc thông tin từng bài viết (tiêu đề, tác giả, chuyên mục, thẻ, lượt xem)
df_articles = vnstock_news.fetch_articles(
    site_name="cafef",
    top_n=5
)
print(df_articles[["title", "author", "category", "publish_time", "url"]])
Khác với bản cũ ở cột tên và nội dung bài

Ở bản 2.x, tên cột của bảng danh sách cũng tuỳ loại nguồn; thế hệ 5 giữ nguyên quy ước đó: RSS cho link, title, description, pubDate, sơ đồ trang cho url, lastmod. Danh mục thế hệ 5 không còn bộ chọn nội dung bài cho trang nào, nên cột content để trống khi đọc theo site_name. Mã cũ dựa vào nội dung bài cần một cấu hình bạn tự viết, xem Tự dựng cấu hình đọc nội dung từ một bài mẫu.


Danh sách việc cần làm khi nâng cấp

  • Chạy vnstock register để đăng nhập khoá API của tài khoản từ cấp Silver trở lên.
  • Nếu cần chạy ngay mã cũ: đổi các dòng import sâu thành import trực tiếp từ vnstock_news (ví dụ from vnstock_news import AsyncBatchCrawler).
  • Nếu muốn tái cấu trúc: thay thế các lời gọi lấy feed bằng fetch_feeder(), thay các lời gọi đọc bài chi tiết bằng fetch_articles().
  • Kiểm tên cột của fetch_feeder() theo loại nguồn (link/pubDate với RSS, url/lastmod với sơ đồ trang).
  • Nếu mã cũ dùng cột content: tự viết cấu hình có content_selector cho trang được phép, vì danh mục không còn kèm.
  • Cập nhật khối bắt lỗi sang try...except NewsError:.