Vnstock Logo

Tùy biến Nâng cao

Cập nhật lần cuối:

Thảo luận

Mục lục

Phần này đi sâu vào các tùy chọn cấu hình và kỹ thuật nâng cao để bạn có thể tùy chỉnh vnstock_news phù hợp với nhu cầu cụ thể, cũng như xử lý các tình huống phức tạp hơn.

4.1. Xử lý Sitemap Động và RSS

Một số trang web sử dụng Sitemap hoặc RSS feeds có URL thay đổi theo thời gian (ví dụ: theo tháng, theo số thứ tự). vnstock_news có khả năng xử lý các trường hợp này thông qua DynamicSitemapResolver.

Cấu hình Sitemap Động

Trong vnstock_news/config/sites.py, bạn có thể thấy cấu hình sitemap với các thuộc tính như pattern_type, format, base_url, index_url:

Python
"tuoitre": {
    "sitemap": {
        "base_url": "https://tuoitre.vn/StaticSitemaps/sitemaps-",
        "pattern_type": "monthly", # Loại pattern: monthly, incremental
        "format": "{year}-{month}", # Định dạng URL
        "extension": "xml",
        "current_url": "https://tuoitre.vn/StaticSitemaps/sitemaps-2025-8.xml" # URL hiện tại (sẽ được cập nhật động)
    },
    # ...
},
"ktsg": {
    "sitemap": {
        "base_url": "https://thesaigontimes.vn/post-sitemap",
        "pattern_type": "incremental",
        "index_url": "https://thesaigontimes.vn/sitemap_index.xml", # URL của sitemap index
        "extension": "xml",
        "current_url": "https://thesaigontimes.vn/post-sitemap156.xml"
    },
    # ...
}

Crawler sẽ tự động sử dụng DynamicSitemapResolver để giải quyết URL Sitemap chính xác tại thời điểm chạy dựa trên các cấu hình này.

Ưu tiên RSS

Khi bạn gọi Crawler.get_articles(), thư viện sẽ ưu tiên sử dụng RSS feeds nếu chúng được cấu hình cho site_name đó. Nếu RSS fetch thất bại hoặc không có RSS, nó sẽ chuyển sang sử dụng Sitemap.

4.2. Xử lý lỗi và Ghi log

vnstock_news sử dụng module logging của Python để cung cấp thông tin chi tiết về quá trình hoạt động. Bạn có thể bật chế độ debug để xem các log cấp thấp hơn.

Python
from vnstock_news.core.crawler import Crawler
from vnstock_news.utils.logger import setup_logger

# Thiết lập logger cho toàn bộ ứng dụng
logger = setup_logger("MyApp", debug=True)

# Khởi tạo Crawler với debug=True để xem log chi tiết từ Crawler
crawler = Crawler(site_name='cafef', debug=True)

try:
    articles = crawler.get_articles(limit=1)
    details = crawler.get_article_details(articles[0]['url'])
    print(details['title'])
except Exception as e:
    logger.error(f"Đã xảy ra lỗi: {e}")

Các lỗi phổ biến và cách xử lý:

  • ValueError: Unsupported site: Tên trang bạn cung cấp không có trong SITES_CONFIG và bạn không cung cấp custom_config.
  • ValueError: No valid RSS or Sitemap source: Trang không có cấu hình RSS/Sitemap hợp lệ hoặc URL Sitemap/RSS bạn cung cấp không thể truy cập được.
  • ValueError: Article content not found: Bộ chọn content_selector không tìm thấy nội dung bài viết trên trang. Cần kiểm tra lại HTML của trang và cập nhật selector.
  • requests.exceptions.RequestException (Timeout, ConnectionError, HTTPError): Lỗi mạng khi cố gắng tải trang. Kiểm tra kết nối internet, URL, hoặc tăng timeout trong các phương thức fetch của Sitemap hoặc News.

4.3. Caching

Thư viện có tích hợp một hệ thống cache đơn giản để lưu trữ phản hồi HTTP, giúp tăng tốc độ thu thập dữ liệu và giảm tải cho máy chủ đích. Cache được khởi tạo tự động và hoạt động ở chế độ nền.

Bạn không cần cấu hình gì thêm để sử dụng cache. Tuy nhiên, nếu bạn gặp vấn đề với dữ liệu cũ, bạn có thể cần xóa cache thủ công (thường là các file trong thư mục tạm thời của hệ thống).

4.4. Tối ưu hóa hiệu suất

  • request_delay trong BatchCrawler: Đặt một độ trễ hợp lý giữa các yêu cầu để tránh bị chặn IP hoặc gây quá tải cho máy chủ đích. Giá trị mặc định là 0.5 giây.
  • limitlimit_per_feed: Sử dụng các tham số này để giới hạn số lượng bài viết được thu thập, đặc biệt khi bạn chỉ cần các tin tức mới nhất.
  • Sử dụng BatchCrawler: Khi cần thu thập nhiều bài viết, BatchCrawler sẽ quản lý các yêu cầu một cách hiệu quả hơn so với việc gọi get_article_details từng cái một trong một vòng lặp đơn giản.

Thảo luận

Đang tải bình luận...