Hướng dẫn Cơ bản
Mục lục
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.
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:
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ệu | Mặc Định | Mô Tả |
|---|---|---|---|
site_name | str | None | Tên định danh của website trong SITES_CONFIG (ví dụ: "vnexpress", "cafef") |
custom_config | dict | None | Dictionary chứa cấu hình bộ chọn và nguồn RSS/Sitemap tự định nghĩa |
limit_per_feed | int | 20 | Số lượng bài viết tối đa cần lấy từ mỗi nguồn RSS feed |
limit | int | 10 | Tổng số lượng bài viết truy xuất khi gọi get_articles() |
sitemap_url | str / list | None | Đườ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:
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ệu | Mặc Định | Mô Tả |
|---|---|---|---|
site_name | str | Bắt buộc | Tên định danh website trong hệ thống cấu hình |
request_delay | float | 1.0 | Thời gian tạm dừng (giây) giữa các lần gửi yêu cầu HTTP |
output_path | str | "./data" | Thư mục lưu trữ tập tin tạm |
limit | int | 10 | Số lượng bài viết tối đa cần bóc tách chi tiết |
sitemap_url | str / list | None | URL sitemap cụ thể cần quét dữ liệu |
debug | bool | False | Bậ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:
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ệu | Mặc Định | Mô Tả |
|---|---|---|---|
site_name | str | Bắt buộc | Tên định danh website nguồn |
max_concurrency | int | 5 | Số yêu cầu đồng thời tối đa; nên giữ ở mức thấp |
sources | list | Bắt buộc | Danh sách đường dẫn Sitemap XML nguồn |
top_n | int | 10 | Số 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:
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ánh | RSS Feeds (Tin Mới) | Sitemap XML (Lịch Sử) |
|---|---|---|
| Tốc độ đọc | Nhanh | Phụ thuộc số bài và thời gian trễ |
| Phạm vi dữ liệu | Chứa các bài mới phát hành gần đây | Chứa danh sách bài viết theo thời gian lưu trữ của website nguồn |
| Độ sâu thông tin | Có sẵn thông tin tóm tắt và ngày đăng | Cần gửi thêm yêu cầu HTTP để đọc chi tiết từng bài |
| Mục đích sử dụng | Cập nhật tin tức mới, nhận thông báo tin bài | Tra lại bài đã đăng cho nghiên cứu cá nhân |
| Cơ chế dự phòng | Tự động chuyển sang Sitemap nếu RSS không hoạt động | Tự độ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ệu | Kiểu Dữ Liệu | Mô Tả Chi Tiết | Ví Dụ Dữ Liệu Mẫu |
|---|---|---|---|
url | str | Đường dẫn URL của bài viết | "https://trangtin.example/thi-truong-chung-khoan-2026.chn" |
title | str | Tiêu đề bài viết | "Thị trường chứng khoán bật tăng mạnh phiên đầu tuần" |
short_description | str | Đ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..." |
content | str | Nộ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_time | datetime | Thời gian xuất bản (dạng ISO) | 2026-04-15 09:30:00 |
author | str | Tên tác giả hoặc nguồn dẫn | "Nguyễn Văn A" / "Theo CafeF" |
category | str | Chuyên mục tin tức | "Chứng khoán" / "Tài chính vĩ mô" |
tags | str | Danh sách từ khóa / Tags bài viết | "VN-Index, Chứng khoán, Lãi suất" |
view_counts | int | Số lượt xem (nếu trang tin có hiển thị) | 15200 |
image_url | str | Đường dẫn ảnh đại diện bài viết | "https://cdn.trangtin.example.vn/thumb_w/640/image.jpg" |
source | str | Tê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.