🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Cách Xây Dựng Một Trình Thu Thập Tin Tức: Hướng Dẫn Từng Bước

Daniel Kim
Daniel Kim

Lead Scraping Automation Engineer

30-Jun-2026

Tóm tắt:

  • Một trình thu thập tin tức có hai vòng: phát hiện, sau đó là lấy. Lấy liên kết bài viết từ trang chính của một mục, sau đó truy cập từng liên kết và trích xuất tiêu đề và nội dung — giữ cho hai giai đoạn tách biệt để mỗi giai đoạn có thể được chạy lại, điều chỉnh tốc độ và mở rộng độc lập.
  • Phát hiện là một vấn đề lọc liên kết. Một trang chính chủ yếu là điều hướng; các liên kết bài viết phù hợp với một hình dạng URL nhận diện được (/news/articles/…, một slug kết thúc bằng một id). Lọc để chỉ lấy những cái đó thay vì lấy mọi liên kết.
  • Trích xuất có nghĩa là phần cốt lõi có thể đọc được, không phải toàn bộ DOM. Đọc h1 và các đoạn trong bài viết; bỏ qua điều hướng, liên kết liên quan và quảng cáo. Số đoạn và độ dài văn bản cho bạn biết ngay lập tức liệu quá trình lấy có thực sự lấy được câu chuyện hay không.
  • Các site tin tức định tuyến theo địa lý và hạn chế tần suất. Ghim proxyCountry và điều chỉnh tốc độ thu thập để một lần quét mục không bị vấp phải giới hạn chống bot giữa chừng.
  • Nó chạy trên Scrapeless Scraping Browser với Puppeteer tĩnh. Trình duyệt đám mây hiển thị các trang chính được xây dựng bằng JS và cung cấp đường thoát dân cư; mã thu thập của bạn chỉ là điều hướng và trích xuất thông thường.
  • Miễn phí để bắt đầu. Các tài khoản Scrapeless mới bao gồm runtime Scraping Browser miễn phí — đăng ký tại app.scrapeless.com.

Giới thiệu: trình thu thập tin tức thực sự làm gì

Một trình thu thập tin tức chuyển đổi một trang chính của mục thành một dòng các bài báo có cấu trúc. Nó thực hiện hai công việc khác nhau. Đầu tiên, phát hiện: đọc trang chính (hoặc một mục, hoặc một sơ đồ trang) và thu thập các liên kết trỏ đến các câu chuyện thực sự. Thứ hai, lấy dữ liệu: truy cập từng câu chuyện và lấy ra tiêu đề và nội dung có thể đọc được, bỏ qua phần điều hướng và quảng cáo.

Giữ cho hai giai đoạn này tách biệt là toàn bộ mẹo. Phát hiện chạy một lần mỗi lần quét và chi phí thấp; lấy dữ liệu chạy một lần mỗi bài viết và là nơi công việc thực sự — và rủi ro hạn chế tốc độ — diễn ra. Tách biệt chúng cho phép bạn thu thập một danh sách liên kết sạch trước, sau đó lấy dữ liệu với tốc độ kiểm soát, và lấy lại một bài viết riêng lẻ mà không cần quét lại trang chính.

Hướng dẫn này xây dựng trình thu thập trong Node trên Scrapeless Scraping Browser — một trình duyệt đám mây chống phát hiện được kết nối với Puppeteer qua một điểm cuối tiêu chuẩn. Các bước phát hiện và trích xuất bên dưới đều được thực hiện chống lại các nguồn tin tức trực tiếp. Nội dung công khai chỉ.


Những gì bạn có thể làm với nó

  • Quét một mục (thế giới, kinh doanh, công nghệ) cho các bài viết mới trong ngày.
  • Trích xuất nội dung bài viết sạch — tiêu đề cộng với các đoạn — để phân tích hoặc chu trình đọc.
  • Cung cấp cho một bộ tổng hợp hoặc kho RAG nội dung có thể đọc được thay vì HTML thô.
  • Theo dõi một chủ đề bằng cách chạy lại phát hiện theo lịch trình và chỉ lấy các liên kết mới.
  • Chéo nguồn bằng cách chỉ định cùng một trình thu thập đến nhiều nguồn khác nhau.

Tại sao chọn Scrapeless Scraping Browser

Scrapeless Scraping Browser là một trình duyệt đám mây tùy chỉnh, chống phát hiện được thiết kế cho các trình thu thập web và các tác nhân AI. Đối với một trình thu thập tin tức cụ thể, nó cung cấp:

  • Kết xuất JS phía đám mây — các trang chính hiện đại xây dựng danh sách liên kết của chúng bằng JavaScript; trình duyệt đám mây thực hiện điều đó để các liên kết tồn tại.
  • Proxy dân cư ở hơn 195 quốc gia — định vị đường thoát đến khu vực mà một trang phục vụ, và tránh việc hạn chế tần suất mà một lần quét mục có thể kích hoạt.
  • Chống phát hiện và dấu vân tay — quá trình thu thập đọc như một trình duyệt thực, vì vậy các trang bài viết tiếp tục được hiển thị trong suốt quá trình chạy lâu.
  • Kết nối Puppeteer tiêu chuẩnPuppeteer.connect() trả về một Browser bình thường; phát hiện và trích xuất là Puppeteer bình thường.
  • Duy trì phiên làm việc — giữ một phiên làm việc ấm trong suốt quá trình quét.

Nhận khóa API của bạn trên kế hoạch miễn phí tại app.scrapeless.com.


Yêu cầu

  • Node.js 18 hoặc mới hơn
  • Tài khoản Scrapeless và khóa API — đăng ký tại app.scrapeless.com
  • Kiến thức cơ bản về Puppeteer

Cài đặt

bash Copy
npm install @scrapeless-ai/sdk puppeteer-core
bash Copy
export SCRAPELESS_API_KEY="your_api_token_here"

Bước 1 — Kết nối

javascript Copy
import { Puppeteer } from '@scrapeless-ai/sdk';

const browser = await Puppeteer.connect({
  apiKey: process.env.SCRAPELESS_API_KEY,
  sessionName: 'news-crawler',
  proxyCountry: 'US',
  sessionTTL: 300,
});

const page = await browser.newPage();

Bước 2 — Phát hiện các liên kết bài viết

Tải trang chính và thu thập các liên kết trông giống như bài viết. Bộ lựa chọn đúng tùy thuộc vào trang web, nhưng nguyên tắc vẫn giống nhau ở mọi nơi: lọc các liên kết xuống còn những cái trỏ đến câu chuyện. Ở đây là trang chính của một nguồn tin tức, lấy một vài liên kết tiêu đề đầu tiên:

javascript Copy
await page.goto('https://text.npr.org/', {
  waitUntil: 'domcontentloaded',
  timeout: 40000,
});

const links = await page.evaluate(() =>
  [...document.querySelectorAll('ul li a')]
    .map((a) => ({ title: a.textContent.trim(), href: a.href }))
    .filter((l) => l.title),
);
javascript Copy
console.log(links.length, 'liên kết —', links[0]);
// 5 liên kết — { tiêu đề: '...', href: 'https://text.npr.org/<article-id>' }

Bước 3 — Lấy và trích xuất từng bài viết

Bây giờ hãy truy cập từng liên kết và lấy nội dung có thể đọc được — tiêu đề h1 và các đoạn văn của bài viết. Việc đếm số đoạn và độ dài văn bản là một kiểm tra độ chính xác nhanh chóng để đảm bảo bạn đã lấy được một câu chuyện thay vì một trang chuyển hướng hoặc một kệ trả tiền:

javascript Copy
async function fetchArticle(page, url) {
  await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 40000 });
  return page.evaluate(() => ({
    title: document.querySelector('h1')?.textContent?.trim(),
    paragraphs: document.querySelectorAll('p').length,
    text: [...document.querySelectorAll('p')].map((p) => p.textContent).join('\n\n'),
  }));
}

const article = await fetchArticle(page, links[0].href);
console.log(article.title, '—', article.paragraphs, 'đoạn văn');
// "Mỹ và Iran công bố thỏa thuận kết thúc chiến tranh, mở lại Eo biển Hormuz" — 40 đoạn văn

Chạy trực tiếp này đã trả về một bài viết 40 đoạn (~5.500 ký tự văn bản cơ thể) từ liên kết tiêu đề — tiêu đề và toàn bộ văn bản, không có phần điều hướng.

Nhận khóa API của bạn trong kế hoạch miễn phí: app.scrapeless.com


Bước 4 — Tập hợp quá trình thu thập

Ghép hai giai đoạn lại với nhau: phát hiện một lần, sau đó lấy từng liên kết với tốc độ kiểm soát. Giữ một tập hợp seen để một lần chạy lại theo lịch chỉ lấy các câu chuyện mới:

javascript Copy
const seen = new Set();
const articles = [];

for (const url of articleLinks) {
  if (seen.has(url)) continue;
  seen.add(url);
  try {
    articles.push({ url, ...(await fetchArticle(page, url)) });
  } catch {
    // bỏ qua bài viết không thể hiển thị; quá trình quét tiếp tục
  }
  await new Promise((r) => setTimeout(r, 1000)); // giữ nhịp cho quá trình thu thập
}

await browser.close();
console.log(articles.length, 'bài viết');

Những gì bạn nhận được

Mỗi bài viết là một bản ghi phẳng — tiêu đề cộng với nội dung có thể đọc được:

json Copy
{
  "url": "https://text.npr.org/nx-s1-5858590",
  "title": "Mỹ và Iran công bố thỏa thuận kết thúc chiến tranh, mở lại Eo biển Hormuz",
  "paragraphs": 40,
  "text": "..."
}
// mẫu minh họa — tiêu đề + số lượng đoạn văn là một bản ghi thực; nội dung văn bản bị lược bỏ.

Một vài quan sát chân thành:

  • Siết lại bộ lọc phát hiện theo từng trang web. Một quá trình lấy rộng có thể kéo theo các liên kết điều hướng và thẻ; khớp hình dạng URL của bài viết.
  • Xác thực việc thu thập. Số lượng đoạn gần bằng không thường có nghĩa là một trang chuyển hướng, một bức tường trả tiền, hoặc một bức tường đồng ý — kiểm tra trước khi tin tưởng bản ghi.
  • Loại bỏ trùng lặp giữa các lần quét. Trang chủ có thể liệt kê lại cùng một câu chuyện; dựa vào URL.
  • Giữ nhịp và cố định. Một khoảng thời gian giữa các lần thu thập và một proxyCountry đã cố định giữ quá trình quét của phần không bị giới hạn tốc độ.

Kết luận: phát hiện, thu thập, lặp lại

Một trình thu thập tin tức có hai giai đoạn rõ ràng — phát hiện các liên kết bài viết từ một trang chủ, sau đó thu thập và trích xuất tiêu đề và nội dung của từng câu chuyện. Giữ chúng tách biệt làm cho quá trình thu thập có thể điều chỉnh được, có thể tiếp tục và dễ dàng lên lịch. Chạy trên Scrapeless Scraping Browser hiển thị các trang front-end được xây dựng bằng JS và cung cấp đường ra dân cư giúp quá trình quét không bị giới hạn tốc độ. Đối với phần thu thập đa trang, xem hướng dẫn phân trang; trang sản phẩm Scraping Browsertài liệu bao quát đầy đủ diện tích SDK. Bộ lọc phát hiện thật chặt chẽ, xác thực mỗi lần thu thập, loại bỏ trùng lặp giữa các lần quét và giữ nhịp cho quá trình thu thập.


Sẵn sàng xây dựng pipeline dữ liệu AI của bạn?

Tham gia cộng đồng của chúng tôi để nhận một kế hoạch miễn phí và kết nối với các nhà phát triển xây dựng pipeline tin tức và nội dung: Discord · Telegram.

Đăng ký tại app.scrapeless.com để nhận thời gian chạy Scraping Browser miễn phí và điều chỉnh các mẫu trên cho các trang web và phần mà quy trình làm việc của bạn cần. Xem giá cả để quy mô.


Câu hỏi thường gặp

Q: Việc thu thập dữ liệu từ các trang tin tức có hợp pháp không?
Việc thu thập nội dung công khai thường được phép, nhưng bản quyền và Điều khoản Dịch vụ của từng trang web quy định những gì bạn có thể lưu trữ và tái xuất bản. Hãy crawl các trang công khai, tôn trọng các quy tắc loại trừ robots và ToS, và tham khảo ý kiến pháp lý cho trường hợp sử dụng của bạn.

H: Làm thế nào để tôi phân tách các liên kết bài viết khỏi điều hướng?
Lọc các điểm neo theo hình dạng URL bài viết của trang — đường dẫn /news/articles/ hoặc một slug kết thúc bằng một id dài — thay vì lấy mọi liên kết trên trang.

H: Làm thế nào để tôi biết bài viết đó thực sự đã được lấy?
Kiểm tra số lượng đoạn văn và độ dài văn bản. Một số lượng gần bằng không báo hiệu một lần chuyển hướng, bức tường trả tiền, hoặc bức tường đồng ý thay vì một câu chuyện.

H: Tôi có cần một proxy không?
Đối với một cuộc quét liên tục, có — gán proxyCountry cho khu vực mà đầu ra phục vụ và điều chỉnh tốc độ crawl để bạn không vượt quá giới hạn tần suất.

H: Làm thế nào để tôi thực hiện điều này theo lịch chỉ cho những câu chuyện mới?
Giữ một tập hợp URL seen đã được lưu trữ; chạy lại việc khám phá theo khoảng thời gian của bạn và chỉ lấy những liên kết bạn chưa ghi lại.

H: Tôi có thể thực hiện điều này mà không cần một tác nhân AI không?
Có. Đó là Puppeteer thông thường trên phiên Scrapeless — không cần tác nhân.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục