Vnstock Logo

Ví dụ Thực tế

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

Thảo luận

Mục lục

Thực hành ngay!

Phần này cung cấp các ví dụ thực tế hoàn chỉnh mà bạn có thể sao chép và chạy ngay. Hãy bắt đầu với các ví dụ đơn giản và tiến tới các kịch bản phức tạp hơn.

Ví dụ thực tế với vnstock_news

Trong phần này, bạn sẽ thấy các ví dụ thực tế về cách sử dụng thư viện vnstock_news để giải quyết các tác vụ thu thập dữ liệu phổ biến:

  • Lấy tin tức từ trang đã cấu hình sẵn - Cách nhanh nhất để bắt đầu
  • Lấy tin tức từ Sitemap/RSS bất kỳ - Thu thập từ các nguồn tùy ý
  • Thu thập hàng loạt hiệu quả - Xử lý nhiều bài viết cùng lúc

Hãy cùng thực hành ngay!


Ví dụ 1: Lấy tin tức từ trang đã cấu hình sẵn

Đây là cách sử dụng cơ bản nhất, tận dụng các cấu hình đã có trong vnstock_news/config/sites.py.

Mục tiêu

  • Lấy 5 bài viết mới nhất từ CafeF
  • Thu thập chi tiết bài viết đầu tiên
  • Hiển thị kết quả

Code hoàn chỉnh

Python
from vnstock_news.core.crawler import Crawler
import pandas as pd

# Khởi tạo Crawler cho trang CafeF
crawler_cafef = Crawler(site_name='cafef')

print("🔍 Đang lấy tin tức từ CafeF...")

# Lấy 5 bài viết mới nhất (metadata) từ CafeF
# Crawler sẽ tự động sử dụng RSS hoặc Sitemap đã cấu hình cho CafeF
article_metadata = crawler_cafef.get_articles(limit=5)

if article_metadata:
    print("✅ 5 bài viết mới nhất từ CafeF:")
    for i, meta in enumerate(article_metadata, 1):
        print(f"{i}. {meta.get('title', 'N/A')} ({meta.get('url', 'N/A')})")

    # Lấy chi tiết bài viết đầu tiên
    first_article_url = article_metadata[0]['url']
    print(f"\n📄 Đang lấy chi tiết bài viết: {first_article_url}")
    detailed_article = crawler_cafef.get_article_details(first_article_url)

    if detailed_article:
        print(f"\n📋 Chi tiết bài viết:")
        print(f"📌 Tiêu đề: {detailed_article.get('title')}")
        print(f"⏰ Thời gian: {detailed_article.get('publish_time')}")
        print(f"👤 Tác giả: {detailed_article.get('author', 'N/A')}")
        print(f"📝 Mô tả: {detailed_article.get('short_description', 'N/A')}")
        print(f"📄 Nội dung (trích đoạn): {detailed_article.get('markdown_content', '')[:150]}...")
else:
    print("❌ Không tìm thấy bài viết nào từ CafeF.")

Kết quả mẫu

🔍 Đang lấy tin tức từ CafeF...
✅ 5 bài viết mới nhất từ CafeF:
1. [Tiêu đề bài viết 1] (https://cafef.vn/bai-viet-1.chn)
2. [Tiêu đề bài viết 2] (https://cafef.vn/bai-viet-2.chn)
...

📄 Đang lấy chi tiết bài viết: https://cafef.vn/bai-viet-1.chn

📋 Chi tiết bài viết:
📌 Tiêu đề: [Tiêu đề đầy đủ của bài viết]
⏰ Thời gian: 2025-01-15 10:30:00
👤 Tác giả: Nguyễn Văn A
📝 Mô tả: Mô tả ngắn về nội dung bài viết...
📄 Nội dung (trích đoạn): Nội dung chính của bài viết được chuyển đổi sang định dạng Markdown...

Ví dụ 2: Lấy tin tức từ Sitemap hoặc RSS bất kỳ

Bạn có thể sử dụng Crawler để lấy tin tức từ một Sitemap hoặc RSS feed bất kỳ, ngay cả khi nó không phải là nguồn mặc định của một trang đã cấu hình sẵn.

Mục tiêu của ví dụ 2

  • Lấy tin tức từ Sitemap của The Saigon Times
  • Lấy tin tức từ RSS của Báo Đầu Tư
  • Xử lý các nguồn tùy ý

Code hoàn chỉnh ví dụ 2

Python
from vnstock_news.core.crawler import Crawler
from vnstock_news.core.rss import RSS
import pandas as pd

print("🌐 Ví dụ thu thập từ nguồn tùy ý")
print("=" * 50)

# --- Ví dụ 1: Lấy từ Sitemap bất kỳ (The Saigon Times) ---
print("\n📍 Ví dụ 1: Lấy từ Sitemap The Saigon Times")
ktsg_sitemap_url = "https://thesaigontimes.vn/post-sitemap.xml" 

try:
    # Chọn site_name có cấu hình parser phù hợp với cấu trúc bài viết trên sitemap này
    crawler_ktsg = Crawler(site_name='ktsg')
    article_metadata_list = crawler_ktsg.get_articles(sitemap_url=ktsg_sitemap_url, limit=3)

    if article_metadata_list:
        print(f"✅ Tìm thấy {len(article_metadata_list)} URL. Đang lấy chi tiết...")
        detailed_articles = []
        
        for meta in article_metadata_list:
            url = meta.get('url')
            if url:
                try:
                    details = crawler_ktsg.get_article_details(url)
                    detailed_articles.append(details)
                except Exception as e:
                    print(f"⚠️ Lỗi khi lấy chi tiết bài viết {url}: {e}")

        if detailed_articles:
            df_sitemap = pd.DataFrame(detailed_articles)
            print("📊 Bài viết chi tiết từ Sitemap:")
            print(df_sitemap[['title', 'url', 'publish_time']].head())
    else:
        print("❌ Không tìm thấy URL bài viết nào trong sitemap.")

except Exception as e:
    print(f"❌ Lỗi xảy ra khi lấy từ sitemap: {e}")

# --- Ví dụ 2: Lấy từ RSS bất kỳ (Báo Đầu Tư) ---
print("\n📍 Ví dụ 2: Lấy từ RSS Báo Đầu Tư")
baodautu_rss_url = "https://baodautu.vn/rss/tin-moi-nhat.rss"

try:
    # Bước 1: Dùng lớp RSS để lấy các mục từ RSS feed
    rss_parser = RSS(rss_url=baodautu_rss_url, description_format='text')
    rss_items = rss_parser.fetch()

    if rss_items:
        print(f"✅ Tìm thấy {len(rss_items)} mục RSS. Đang lấy chi tiết...")
        
        # Khởi tạo Crawler với site_name phù hợp để có cấu hình parser
        crawler_baodautu = Crawler(site_name='baodautu')
        
        # Bước 2: Lấy chi tiết từng bài viết từ các URL trong RSS feed
        detailed_articles_from_rss = []
        
        for item in rss_items:
            url = item.get('link')  # Các mục RSS thường dùng 'link' cho URL
            if url:
                try:
                    details = crawler_baodautu.get_article_details(url)
                    detailed_articles_from_rss.append(details)
                except Exception as e:
                    print(f"⚠️ Lỗi khi lấy chi tiết bài viết {url}: {e}")

        if detailed_articles_from_rss:
            df_rss = pd.DataFrame(detailed_articles_from_rss)
            print("📊 Bài viết chi tiết từ RSS:")
            print(df_rss[['title', 'url', 'publish_time']].head())
    else:
        print("❌ Không tìm thấy mục nào trong RSS feed.")

except Exception as e:
    print(f"❌ Lỗi xảy ra khi lấy từ RSS: {e}")

Kết quả mẫu ví dụ 2

🌐 Ví dụ thu thập từ nguồn tùy ý
==================================================

📍 Ví dụ 1: Lấy từ Sitemap The Saigon Times
✅ Tìm thấy 3 URL. Đang lấy chi tiết...
📊 Bài viết chi tiết từ Sitemap:
                                            title                                                url          publish_time
0  [Tiêu đề bài viết KTSG 1]  https://thesaigontimes.vn/bai-viet-1.html  2025-01-15 09:00
1  [Tiêu đề bài viết KTSG 2]  https://thesaigontimes.vn/bai-viet-2.html  2025-01-15 08:30
...

📍 Ví dụ 2: Lấy từ RSS Báo Đầu Tư
✅ Tìm thấy 10 mục RSS. Đang lấy chi tiết...
📊 Bài viết chi tiết từ RSS:
                                           title                                               url          publish_time
0  [Tiêu đề bài viết BĐT 1]  https://baodautu.vn/bai-viet-1.html  2025-01-15 10:15
1  [Tiêu đề bài viết BĐT 2]  https://baodautu.vn/bai-viet-2.html  2025-01-15 09:45
...

Ví dụ 3: Thu thập tin tức hàng loạt với BatchCrawler

Khi bạn cần thu thập chi tiết của một lượng lớn bài viết, BatchCrawler là công cụ hiệu quả để quản lý các yêu cầu và độ trễ.

Mục tiêu của ví dụ 3

  • Lấy 10 bài viết từ VnExpress
  • Thu thập chi tiết hàng loạt
  • Quản lý hiệu suất và tránh bị chặn IP

Code hoàn chỉnh ví dụ 3

Python
from vnstock_news.core.crawler import Crawler
from vnstock_news.core.batch import BatchCrawler
import pandas as pd
import time

print("📦 Ví dụ thu thập hàng loạt hiệu quả")
print("=" * 50)

# Bước 1: Lấy danh sách URL từ một nguồn (VnExpress RSS)
print("\n🔍 Bước 1: Lấy danh sách URL từ VnExpress...")
crawler_vnexpress = Crawler(site_name='vnexpress')

start_time = time.time()
article_metadata = crawler_vnexpress.get_articles(limit=10)  # Lấy 10 URL
fetch_time = time.time() - start_time

print(f"✅ Lấy được {len(article_metadata)} URL trong {fetch_time:.2f} giây")

if article_metadata:
    urls_to_batch_fetch = [item['url'] for item in article_metadata]
    print(f"\n🚀 Bước 2: Thu thập hàng loạt {len(urls_to_batch_fetch)} bài viết...")

    # Bước 2: Khởi tạo BatchCrawler và thực hiện thu thập
    # Đặt request_delay để tránh bị chặn IP
    batch_crawler = BatchCrawler(site_name='vnexpress', request_delay=0.5)
    
    start_time = time.time()
    detailed_articles_df = batch_crawler.fetch_details_for_urls(urls=urls_to_batch_fetch)
    batch_time = time.time() - start_time

    if not detailed_articles_df.empty:
        print(f"✅ Hoàn thành thu thập trong {batch_time:.2f} giây")
        print(f"📊 Kết quả thu thập hàng loạt:")
        print(f"   - Tổng bài viết: {len(detailed_articles_df)}")
        print(f"   - Thời gian trung bình/bài: {batch_time/len(detailed_articles_df):.2f} giây")
        
        # Hiển thị 5 dòng đầu tiên
        print("\n📋 5 bài viết đầu tiên:")
        for idx, row in detailed_articles_df.head().iterrows():
            print(f"{idx+1}. {row['title'][:50]}...")
            print(f"   📅 {row['url']}")
            print(f"   ⏰ {row['publish_time']}")
            print()
        
        # Thống kê cơ bản
        print("📈 Thống kê cơ bản:")
        print(f"   - Có tác giả: {detailed_articles_df['author'].notna().sum()}/{len(detailed_articles_df)}")
        print(f"   - Có mô tả ngắn: {detailed_articles_df['short_description'].notna().sum()}/{len(detailed_articles_df)}")
        print(f"   - Có nội dung: {detailed_articles_df['markdown_content'].notna().sum()}/{len(detailed_articles_df)}")
        
        # Lưu kết quả ra file CSV (tùy chọn)
        output_file = "vnexpress_articles_batch.csv"
        detailed_articles_df.to_csv(output_file, index=False, encoding='utf-8')
        print(f"\n💾 Đã lưu kết quả vào file: {output_file}")
        
    else:
        print("❌ Không thu thập được bài viết nào trong lô.")
else:
    print("❌ Không có URL nào để thu thập hàng loạt.")

print(f"\n⏱️ Tổng thời gian thực hiện: {time.time() - start_time:.2f} giây")

Kết quả mẫu ví dụ 3

📦 Ví dụ thu thập hàng loạt hiệu quả
==================================================

🔍 Bước 1: Lấy danh sách URL từ VnExpress...
✅ Lấy được 10 URL trong 1.23 giây

🚀 Bước 2: Thu thập hàng loạt 10 bài viết...
✅ Hoàn thành thu thập trong 6.45 giây
📊 Kết quả thu thập hàng loạt:
   - Tổng bài viết: 10
   - Thời gian trung bình/bài: 0.65 giây

📋 5 bài viết đầu tiên:
1. [Tiêu đề bài viết VnExpress 1]...
   📅 https://vnexpress.net/bai-viet-1.html
   ⏰ 2025-01-15 11:30:00

2. [Tiêu đề bài viết VnExpress 2]...
   📅 https://vnexpress.net/bai-viet-2.html
   ⏰ 2025-01-15 11:15:00
...

📈 Thống kê cơ bản:
   - Có tác giả: 9/10
   - Có mô tả ngắn: 10/10
   - Có nội dung: 10/10

💾 Đã lưu kết quả vào file: vnexpress_articles_batch.csv

⏱️ Tổng thời gian thực hiện: 7.68 giây

Kết luận và mẹo thực hành

Điểm chính đã học

  1. Sử dụng Crawler cơ bản với các trang đã cấu hình sẵn
  2. Thu thập từ nguồn tùy ý (Sitemap/RSS bất kỳ)
  3. Thu thập hàng loạt hiệu quả với BatchCrawler
  4. Xử lý lỗi và ngoại lệ trong thực tế
  5. Lưu kết quả ra các định dạng khác nhau

Mẹo thực hành

  • Bắt đầu từ từ đơn giản: Dùng các trang đã cấu hình sẵn trước
  • Kiểm tra kết quả: Luôn in ra kết quả để xác nhận hoạt động
  • Sử dụng logging: Bật debug mode khi gặp lỗi
  • Tối ưu hóa request_delay: Điều chỉnh theo từng trang web
  • Lưu kết quả: Xuất ra CSV/Excel để phân tích sau

Bước tiếp theo

  • Tùy chỉnh cấu hình: Thêm các trang web mới vào sites.py
  • Xây dựng pipeline tự động: Tạo lịch thu thập định kỳ
  • Phân tích dữ liệu: Sử dụng pandas/numpy để phân tích nội dung
  • Tích hợp với ứng dụng: Xây dựng API hoặc dashboard

Tài nguyên tham khảo


💡 Mẹo cuối cùng: Hãy bắt đầu với các ví dụ đơn giản, sau đó dần dần thử các kịch bản phức tạp hơn. Đừng ngại thử nghiệm và điều chỉnh theo nhu cầu của bạn!

Thảo luận

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