Tùy biến Nâng cao
Cập nhật lần cuối:
Thảo luậnMục lục
Nâng cao - Dành cho người dùng có kinh nghiệm
Nâng cao với vnstock_news
Khi bạn đã làm quen với các khái niệm cơ bản, vnstock_news cung cấp nhiều tính năng nâng cao để giải quyết các tình huống phức tạp và tối ưu hóa hiệu suất:
- Xử lý Sitemap/RSS động - Tự động giải quyết URL thay đổi theo thời gian
- Logging và Error Handling - Ghi log chi tiết và xử lý lỗi hiệu quả
- Caching - Tối ưu hóa tốc độ với hệ thống cache tích hợp
- Performance Optimization - Tối ưu hóa hiệu suất thu thập dữ liệu
Hãy khám phá từng tính năng nâng cao!
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:
"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.
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.
Thiết lập Logging
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ý
| Loại lỗi | Nguyên nhân | Cách xử lý |
|---|---|---|
ValueError: Unsupported site | Tên trang không có trong SITES_CONFIG và không cung cấp custom_config | Kiểm tra lại tên trang hoặc 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 không thể truy cập | Kiểm tra URL và cấu hình RSS/Sitemap của trang |
ValueError: Article content not found | content_selector không tìm thấy nội dung bài viết | Kiểm tra lại HTML của trang và cập nhật selector |
requests.exceptions.RequestException | Lỗi mạng (Timeout, ConnectionError, HTTPError) | Kiểm tra kết nối internet, URL, hoặc tăng timeout |
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.
Cache hoạt động như thế nào?
- Tự động lưu trữ: Mọi phản hồi HTTP đều được cache tự động
- Tăng tốc độ: Các yêu cầu trùng lặp sẽ được phục vụ từ cache
- Giảm tải: Giảm số lượng request đến máy chủ đích
- Minh bạch: Hoạt động ngầm mà không cần cấu hình gì thêm
Mẹo: 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).
Tối ưu hóa hiệu suất
Khi thu thập dữ liệu ở quy mô lớn, việc tối ưu hóa hiệu suất là rất quan trọng. Dưới đây là các kỹ thuật và mẹo để tối ưu hóa:
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.
# Đặt độ trễ 0.5 giây giữa mỗi yêu cầu
batch_crawler = BatchCrawler(site_name='cafef', request_delay=0.5)
# Đặt độ trễ 1 giây cho các trang nhạy cảm
batch_crawler_sensitive = BatchCrawler(site_name='vnexpress', request_delay=1.0)Sử dụng limit và limit_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.
# Chỉ lấy 5 bài viết mới nhất
articles = crawler.get_articles(limit=5)
# Giới hạn 10 bài viết mỗi feed
articles = crawler.get_articles(limit_per_feed=10)Sử dụng BatchCrawler hiệu quả
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.
# Không hiệu quả - gọi từng bài viết
for url in urls:
details = crawler.get_article_details(url)
# xử lý details...
# Hiệu quả - sử dụng BatchCrawler
batch_crawler = BatchCrawler(site_name='cafef', request_delay=0.5)
detailed_articles_df = batch_crawler.fetch_details_for_urls(urls=urls)
# xử lý DataFrame...Mẹo tối ưu hóa khác
- Sử dụng RSS khi có thể: RSS thường nhẹ hơn và tải nhanh hơn Sitemap
- Chọn thời điểm thu thập hợp lý: Tránh giờ cao điểm của trang web
- Xử dụng concurrent requests:
BatchCrawlerđã tối ưu việc này - Giám sát log: Bật debug mode để theo dõi hiệu suất
Tiếp theo
Bây giờ bạn đã nắm vững các kỹ thuật nâng cao của vnstock_news! Hãy tiếp tục với:
- Ví dụ Thực tế - Xem các ví dụ thực tế và kịch bản sử dụng phức tạp
Thảo luận