Giới Thiệu: Giải Phóng Sức Lao Động Khi Cào Dữ Liệu Python Telegram Bot
Trong công việc hàng ngày, chắc hẳn anh em lập trình viên hay Webmaster đều từng trải qua cảm giác mệt mỏi khi phải: **Ngồi F5 liên tục một trang web để canh giá sản phẩm giảm, theo dõi bài viết mới trên forum, hoặc kiểm tra xem mã giảm giá hosting/domain có còn hoạt động hay không.**
Thay vì tốn thời gian thao tác thủ công rủi ro, chúng ta hoàn toàn có thể tự xây dựng một hệ thống **cào dữ liệu Python Telegram Bot** tự động hóa 100%. Mỗi khi trang web mục tiêu có thay đổi hoặc xuất hiện thông tin thỏa mãn điều kiện, một tin nhắn thông báo kèm đường dẫn và hình ảnh đẹp mắt sẽ được gửi thẳng về ứng dụng Telegram trên điện thoại của bạn ngay lập tức.
Để vận hành bot chạy liên tục 24/7 mà không cần bật máy tính cá nhân, bạn chỉ cần một **máy chủ VPS NVMe SSD giá rẻ** (chỉ từ $2.29 – $3.5/tháng) để treo Docker container.
1. Mô Hình Kiến Trúc Hệ Thống Cào Dữ Liệu Python Telegram Bot
Sơ đồ thể hiện luồng hoạt động tự động của hệ thống từ khâu cào dữ liệu đến khi đẩy thông báo về điện thoại:
Luồng hoạt động
2. Khởi Tạo Telegram Bot & Lấy Token Trong 3 Phút
### Bước 1: Tạo Bot Mới Với BotFather
1. Mở ứng dụng Telegram trên điện thoại hoặc máy tính, tìm kiếm tài khoản chính thức `@BotFather`.
2. Gửi lệnh `/newbot` vào khung chat.
3. Nhập tên hiển thị cho Bot (ví dụ: `ToniTechAlertBot`) và username cho Bot (kết thúc bằng `_bot`, ví dụ: `tonitech_alert_bot`).
4. BotFather sẽ trả về một chuỗi **HTTP API Token** có dạng: `7890123456:AAFlx...your_bot_token`.
### Bước 2: Lấy `CHAT_ID` Cá Nhân Để Nhận Thông Báo
Để Bot biết chính xác cần gửi tin nhắn cho ai:
1. Tìm bot `@userinfobot` trên Telegram và bấm **Start**.
2. Bot sẽ trả về chuỗi ID cá nhân của bạn (ví dụ `CHAT_ID = 123456789`).
3. (Nếu muốn gửi vào nhóm): Thêm Bot vừa tạo vào Group Telegram, cấp quyền Admin, sau đó lấy Chat ID của nhóm.
3. Kỹ Thuật Viết Script Cào Dữ Liệu Python Telegram Bot: BeautifulSoup4 vs Playwright
Chúng ta sẽ bóc tách 2 kỹ thuật cào dữ liệu phổ biến nhất tùy thuộc vào cấu trúc của trang web mục tiêu.
3.1. Kỹ Thuật 1: Cào Web Tĩnh Siêu Tốc Với `requests` & `BeautifulSoup4`
Áp dụng cho các trang web truyền thống (WordPress, HTML tĩnh, tin tức) nơi dữ liệu nằm sẵn trong mã nguồn HTML trả về.
Cài đặt thư viện:
pip install requests beautifulsoup4 python-dotenvTạo file `scraper_static.py`:
import requests
from bs4 import BeautifulSoup
def scrape_latest_deal():
url = "https://toniblog.net/blog/so-sanh-gia-vps-nvme/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
# Parse HTML với BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
# Lấy tiêu đề bài viết và thông tin deal
title = soup.find("h1").text.strip()
coupon_box = soup.find("blockquote")
coupon_text = coupon_box.text.strip() if coupon_box else "Không tìm thấy mã"
return {
"title": title,
"details": coupon_text,
"url": url
}
except Exception as e:
print(f"Lỗi cào dữ liệu: {e}")
return None
if __name__ == "__main__":
data = scrape_latest_deal()
print("Dữ liệu cào được:", data)3.2. Kỹ Thuật 2: Cào Web Động Render JavaScript Với `Playwright Python`
Áp dụng cho các trang web hiện đại (React, Vue, Next.js SPA) nơi dữ liệu được nạp bất đồng bộ qua JavaScript sau khi tải trang.
Cài đặt Playwright:
pip install playwright
playwright install chromiumTạo file `scraper_dynamic.py`:
from playwright.sync_api import sync_playwright
def scrape_dynamic_price():
url = "https://example.com/product-page"
with sync_playwright() as p:
# Khởi tạo trình duyệt Headless Chromium
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# Giả lập User-Agent trình duyệt thật
page.set_extra_http_headers({
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
})
page.goto(url, wait_until="networkidle")
# Chờ phần tử chứa giá sản phẩm xuất hiện trong DOM
page.wait_for_selector(".product-price")
price = page.locator(".product-price").inner_text()
title = page.locator("h1.product-title").inner_text()
browser.close()
return {
"title": title,
"price": price,
"url": url
}
if __name__ == "__main__":
print(scrape_dynamic_price())4. Gửi Thông Báo Tự Động Trong Cụm Cào Dữ Liệu Python Telegram Bot
Bây giờ chúng ta sẽ viết hàm gửi thông báo Telegram với định dạng HTML chuyên nghiệp (hỗ trợ in đậm, chèn đường dẫn link và mã code).
Tạo file `telegram_bot.py`:
import os
import requests
from dotenv import load_dotenv
load_dotenv()
BOT_TOKEN = os.getenv("BOT_TOKEN", "7890123456:AAFlx...your_token")
CHAT_ID = os.getenv("CHAT_ID", "123456789")
def send_telegram_alert(title, details, link):
"""
Gửi tin nhắn định dạng HTML sang Telegram Bot
"""
api_url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
# Soạn thảo nội dung tin nhắn dạng HTML
message_text = (
f"🚀 <b>THÔNG BÁO TỰ ĐỘNG TỪ PYTHON BOT</b>\n\n"
f"📌 <b>Chủ đề:</b> {title}\n"
f"💡 <b>Chi tiết:</b> {details}\n\n"
f"🔗 <a href='{link}'>Click vào đây để xem chi tiết</a>\n"
f"⏰ <i>Thời gian: Vừa cập nhật</i>"
)
payload = {
"chat_id": CHAT_ID,
"text": message_text,
"parse_mode": "HTML",
"disable_web_page_preview": False
}
try:
response = requests.post(api_url, json=payload, timeout=10)
res_data = response.json()
if res_data.get("ok"):
print("✅ Đã gửi thông báo Telegram thành công!")
else:
print(f"❌ Lỗi gửi Telegram: {res_data.get('description')}")
except Exception as e:
print(f"❌ Lỗi kết nối Telegram API: {e}")
if __name__ == "__main__":
send_telegram_alert(
title="Ưu đãi VPS NVMe AZDIGI Giảm 30%",
details="Mã giảm giá TONIDEV30 đã sẵn sàng sử dụng!",
link="https://toniblog.net/blog/so-sanh-gia-vps-nvme/"
)5. Lập Lịch Tự Động (Schedule / Cronjob) Cho Script Cào Dữ Liệu Python Telegram Bot
Tạo file hoàn chỉnh `main.py` tự động chạy cào dữ liệu và thông báo theo chu kỳ 15 phút một lần bằng thư viện `schedule`:
pip install scheduleNội dung file `main.py`:
import time
import schedule
from scraper_static import scrape_latest_deal
from telegram_bot import send_telegram_alert
# Lưu trạng thái cũ để tránh gửi tin nhắn trùng lặp
last_scraped_title = None
def job():
global last_scraped_title
print("🔄 Đang tiến hành cào dữ liệu...")
data = scrape_latest_deal()
if not data:
return
# Chỉ gửi tin nhắn nếu có dữ liệu mới khác lần cào trước
if data["title"] != last_scraped_title:
last_scraped_title = data["title"]
send_telegram_alert(
title=data["title"],
details=data["details"],
link=data["url"]
)
else:
print("ℹ️ Dữ liệu không có thay đổi mới. Không gửi tin nhắn.")
# Lập lịch chạy tự động mỗi 15 phút
schedule.every(15).minutes.do(job)
if __name__ == "__main__":
print("🤖 Python Automation Bot đang chạy ngầm...")
# Chạy lần đầu ngay khi bật script
job()
while True:
schedule.run_pending()
time.sleep(1)6. Đóng Gói Docker & Treo Ngầm Script Cào Dữ Liệu Python Telegram Bot 24/7 Trên VPS
Để script **cào dữ liệu Python Telegram Bot** hoạt động ổn định mà không bị gián đoạn khi bạn tắt máy tính cá nhân, chúng ta sẽ đóng gói dự án bằng Docker và đưa lên máy chủ VPS.
6.1. Viết File `Dockerfile` Tinh Gọn
Tạo file `Dockerfile` tại thư mục dự án:
# Sử dụng Python 3.11 Slim siêu nhẹ
FROM python:3.11-slim
WORKDIR /app
# Đặt biến môi trường Python không ghi cache file .pyc
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]6.2. Viết File `docker-compose.yml` & Khởi Chạy Ngầm
Tạo file `docker-compose.yml`:
version: '3.8'
services:
python-telegram-scraper:
build: .
container_name: python_telegram_bot
restart: always
environment:
- BOT_TOKEN=7890123456:AAFlx...your_token
- CHAT_ID=123456789Khởi chạy container chạy ngầm 24/7 trên VPS:
docker compose up -d --buildKiểm tra log hoạt động của Bot:
docker logs -f python_telegram_bot7. Bảng Checklist Rà Soát Tự Động Hóa Python Bot
| STT | Hạng Mục Kiểm Tra | Thao Tác Thực Hiện | Trạng Thái |
|---|---|---|---|
| 1 | Bot Token & Chat ID | Đã tạo Bot qua BotFather & lấy Chat ID | [x] Đã khởi tạo |
| 2 | Scraper Engine | Chạy kiểm thử cào HTML / JSON thành công | [x] Đã test |
| 3 | Telegram HTML Format | Tin nhắn hiển thị đẹp mắt, đường dẫn click được | [x] Đã format |
| 4 | Deduplication | Đã xử lý lọc dữ liệu trùng lặp để không Spam Bot | [x] Đã xử lý |
| 5 | Dockerization | File Dockerfile build thành công image < 150MB |
[x] Đã đóng gói |
| 6 | VPS Daemon | Container chạy ngầm với restart: always |
[x] Đã treo ngầm |
Câu Hỏi Thường Gặp (FAQ)
Bạn sử dụng endpoint `sendPhoto` của Telegram API thay vì `sendMessage`. Truyền đường dẫn URL ảnh vào tham số `photo` hoặc upload file binary dạng `multipart/form-data`.
Tổng Kết & Tài Nguyên Mã Nguồn Mẫu
Chỉ với 15 phút thực hành bài **hướng dẫn cào dữ liệu Python Telegram Bot**, bạn đã tự xây dựng thành công một trợ lý ảo thông minh 24/7. Hệ thống tự động theo dõi biến động dữ liệu web và gửi cảnh báo tức thì về điện thoại, giúp bạn tiết kiệm hàng trăm giờ làm việc thủ công mỗi tháng.
