Vnstock Logo

Hướng dẫn Cơ bản

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

Thảo luận

Mục lục

3. Hướng dẫn Cơ bản

Phần này cung cấp hướng dẫn chi tiết về cách sử dụng các lớp và phương thức cơ bản trong thư viện vnstock_news.

3.1. Lớp Crawler

Lớp Crawler là giao diện chính để tương tác với thư viện, cho phép bạn thu thập danh sách bài viết từ các nguồn cấp dữ liệu (RSS/Sitemap) và trích xuất nội dung chi tiết của từng bài viết.

Khởi tạo Crawler

Bạn có thể khởi tạo Crawler bằng cách chỉ định site_name (tên trang web đã được cấu hình sẵn) hoặc cung cấp một custom_config.

Python
from vnstock_news.core.crawler import Crawler

# Khởi tạo với tên trang đã cấu hình sẵn (ví dụ: 'cafef')
crawler_cafef = Crawler(site_name='cafef')

# Khởi tạo với cấu hình tùy chỉnh (nếu trang không có sẵn hoặc bạn muốn ghi đè cấu hình)
custom_config = {
    "site_name": "my_custom_site",
    "config": {
        "title_selector": {"tag": "h1", "class": "article-title"},
        "content_selector": {"tag": "div", "class": "article-content"},
        "short_desc_selector": {"class": "sapo"},
        "publish_time_selector": {"class": "time"},
        "author_selector": {"class": "author"}
    }
}
crawler_custom = Crawler(custom_config=custom_config)

# Khởi tạo với chế độ debug để xem log chi tiết
crawler_debug = Crawler(site_name='vnexpress', debug=True)

Làm thế nào để thiết lập các selector?

Các selector này là các CSS Selector, một cú pháp dùng để chọn các phần tử (element) trong một tài liệu HTML. Để lấy các selector này, bạn có thể sử dụng công cụ phát triển (Developer Tools) của trình duyệt:

  1. Mở trang web của bài viết bạn muốn lấy thông tin.
  2. Nhấp chuột phải vào phần tử bạn muốn lấy (ví dụ: tiêu đề, nội dung, tác giả) và chọn "Inspect" (Kiểm tra).
  3. Công cụ phát triển sẽ mở ra và làm nổi bật phần tử HTML tương ứng.
  4. Nhấp chuột phải vào phần tử HTML đó, chọn "Copy" > "Copy selector".

Thao tác này sẽ sao chép một CSS selector duy nhất cho phần tử đó vào clipboard của bạn. Tuy nhiên, selector được sao chép tự động có thể quá phức tạp hoặc không ổn định. Bạn nên cố gắng tìm một selector đơn giản và đáng tin cậy hơn bằng cách xem xét các thuộc tính tag, class, hoặc id của phần tử.

Để tìm hiểu thêm về CSS Selectors, bạn có thể tham khảo tài liệu của MDN Web Docs.

Phương thức get_articles()

Phương thức này dùng để lấy danh sách các bài viết (chỉ metadata như URL, thời gian xuất bản) từ RSS feed hoặc Sitemap của trang đã cấu hình. Crawler sẽ tự động ưu tiên RSS nếu có.

Python
# Lấy 10 bài viết mới nhất từ trang 'cafef'
article_metadata = crawler_cafef.get_articles(limit=10)

for article in article_metadata:
    print(f"Tiêu đề: {article.get('title')}, URL: {article.get('url')}")

# Bạn cũng có thể chỉ định một sitemap_url hoặc rss_url cụ thể để ghi đè cấu hình mặc định
# Lưu ý: Nếu bạn truyền một RSS URL vào sitemap_url, Crawler sẽ tự động nhận diện và sử dụng RSS parser.
custom_sitemap_url = "https://thesaigontimes.vn/post-sitemap.xml"
articles_from_custom_sitemap = crawler_cafef.get_articles(sitemap_url=custom_sitemap_url, limit=5)

custom_rss_url = "https://vnexpress.net/rss/tin-moi-nhat.rss"
articles_from_custom_rss = crawler_cafef.get_articles(sitemap_url=custom_rss_url, limit=5)

Phương thức get_article_details(url)

Phương thức này dùng để lấy toàn bộ nội dung chi tiết của một bài viết cụ thể dựa trên URL của nó. Nội dung sẽ được phân tích và trả về dưới dạng một dictionary.

Python
# Giả sử bạn đã có một URL bài viết từ get_articles()
article_url = "https://cafef.vn/vi-du-bai-viet-123.chn"

article_details = crawler_cafef.get_article_details(article_url)

if article_details:
    print(f"Tiêu đề: {article_details.get('title')}")
    print(f"Mô tả ngắn: {article_details.get('short_description')}")
    print(f"Nội dung Markdown: {article_details.get('markdown_content')[:200]}...")
    print(f"Thời gian xuất bản: {article_details.get('publish_time')}")
    print(f"Tác giả: {article_details.get('author')}")

3.2. Lớp RSS

Lớp RSS được sử dụng để trực tiếp phân tích các RSS feeds. Bạn có thể sử dụng nó khi bạn chỉ muốn làm việc với RSS và không cần các tính năng quản lý cấu hình trang của Crawler.

Khởi tạo RSS

Bạn có thể khởi tạo RSS bằng cách cung cấp rss_url hoặc site_name.

Python
from vnstock_news.core.rss import RSS

# Khởi tạo với một RSS URL cụ thể
rss_parser = RSS(rss_url="https://vnexpress.net/rss/tin-moi-nhat.rss")

# Hoặc khởi tạo với tên trang đã cấu hình sẵn (sẽ sử dụng RSS URLs từ cấu hình đó)
rss_parser_vnexpress = RSS(site_name='vnexpress')

Phương thức fetch()

Phương thức fetch() sẽ tải và phân tích RSS feed, trả về một danh sách các dictionary, mỗi dictionary đại diện cho một mục tin trong feed.

Python
rss_items = rss_parser.fetch()

for item in rss_items:
    print(f"Tiêu đề: {item.get('title')}, Link: {item.get('link')}, Ngày: {item.get('pubDate')}")

3.3. Lớp Sitemap

Lớp Sitemap được sử dụng để trực tiếp phân tích các XML Sitemaps. Tương tự như RSS, bạn sử dụng nó khi bạn chỉ muốn làm việc với Sitemaps.

Khởi tạo Sitemap

Bạn khởi tạo Sitemap bằng cách cung cấp URL của Sitemap.

Python
from vnstock_news.core.sitemap import Sitemap

sitemap_parser = Sitemap(url="https://cafef.vn/latest-news-sitemap.xml")

Phương thức run()

Phương thức run() sẽ tải và phân tích Sitemap, trả về một Pandas DataFrame chứa các URL và thời gian sửa đổi cuối cùng (lastmod).

Python
sitemap_df = sitemap_parser.run()

print(sitemap_df.head())

3.4. Lớp BatchCrawler

Lớp BatchCrawler được thiết kế để thu thập chi tiết của nhiều bài viết một cách hiệu quả, thường được sử dụng sau khi bạn đã có một danh sách các URL từ Crawler.get_articles() hoặc RSS.fetch().

Khởi tạo BatchCrawler

Bạn khởi tạo BatchCrawler với site_name (để biết cách phân tích nội dung) và có thể tùy chỉnh độ trễ giữa các yêu cầu.

Python
from vnstock_news.core.batch import BatchCrawler

batch_crawler = BatchCrawler(site_name='cafef', request_delay=0.5) # 0.5 giây giữa mỗi yêu cầu

Phương thức fetch_details_for_urls(urls=...)

Phương thức này nhận một danh sách các URL và sẽ thu thập chi tiết của từng URL đó. Kết quả trả về là một Pandas DataFrame chứa thông tin chi tiết của tất cả các bài viết đã thu thập.

Python
# Giả sử bạn có một danh sách các URL cần thu thập chi tiết
urls_to_fetch = [
    "https://cafef.vn/bai-viet-1.chn",
    "https://cafef.vn/bai-viet-2.chn",
    # ...
]

detailed_articles_df = batch_crawler.fetch_details_for_urls(urls=urls_to_fetch)

print(detailed_articles_df.head())

3.5. Cấu trúc Dữ liệu Trả về

Khi bạn lấy chi tiết một bài viết bằng Crawler.get_article_details(url) hoặc BatchCrawler.fetch_details_for_urls(urls=...), dữ liệu trả về sẽ là một dictionary (cho một bài viết) hoặc một DataFrame (cho nhiều bài viết) với các cột sau:

Tên cộtKiểu dữ liệuMô tả
titlestringTiêu đề của bài viết.
short_descriptionstringMô tả ngắn hoặc sapo của bài viết.
markdown_contentstringNội dung chính của bài viết, được chuyển đổi sang định dạng Markdown.
publish_timestringThời gian xuất bản của bài viết.
authorstringTên tác giả của bài viết.
urlstringURL gốc của bài viết.
categorystringChuyên mục của bài viết (ví dụ: "Kinh doanh", "Công nghệ").

Lưu ý: Nếu một thông tin nào đó không thể được trích xuất (ví dụ: không tìm thấy tác giả hoặc selector không được định cấu hình), giá trị tương ứng trong dữ liệu trả về sẽ là None.

Thảo luận

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