Sản phẩmTích hợpTài nguyênTài liệuGiá cả
Bắt đầu ngay

© 2026 CapSolver. All rights reserved.

Liên hệ chúng tôi

Slack: lola@capsolver.com

Sản phẩm

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Tiện ích trình duyệt
  • Thêm nhiều loại CAPTCHA

Tích hợp

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Đối tác
  • Xem tất cả tích hợp

Tài nguyên

  • Chương trình giới thiệu
  • Tài liệu
  • Tham chiếu API
  • Blog
  • Câu hỏi thường gặp
  • Thuật ngữ
  • Trạng thái

Pháp lý

  • Điều khoản dịch vụ
  • Chính sách bảo mật
  • Chính sách hoàn tiền
  • Không bán thông tin cá nhân của tôi
//Làm thế nào để xây dựng các trình thu thập dữ liệu cho việc thu thập dữ liệu từ web trong n8n với CapSolver
Apr03, 2026

Làm thế nào để xây dựng các trình thu thập dữ liệu cho việc thu thập dữ liệu từ web trong n8n với CapSolver

Anh Tuan

Anh Tuan

Data Science Expert

Nếu bạn từng cố gắng trích xuất giá cả, dữ liệu sản phẩm hoặc nội dung trang được bảo vệ, bạn đã biết phần khó không chỉ là tải URL. Quy trình cũng phải giải quyết các CAPTCHA của trang, gửi token đã giải theo cách mà trang mong đợi, sau đó trích xuất dữ liệu đúng từ phản hồi được bảo vệ.

Đó là lý do tại sao các ví dụ đơn giản "giải CAPTCHA và xong" không đủ cho tự động hóa thực tế. Một trang có thể mong đợi token trong tiêu đề, nội dung biểu mẫu, dữ liệu JSON, tham số truy vấn, cookie hoặc trường cụ thể của ứng dụng khác. Nó có thể sử dụng reCAPTCHA, Turnstile hoặc một loại CAPTCHA hoàn toàn khác. Và khi phản hồi được bảo vệ trở lại, các bộ chọn và logic đầu ra vẫn cần khớp với mục tiêu của bạn.

Trong hướng dẫn này, bạn sẽ học cách xây dựng các trình trích xuất cho các trang có CAPTCHA trong n8n bằng cách sử dụng CapSolver. Hướng dẫn chính dựa trên quy trình kho lưu trữ Scraping — Price & Product Details — CapSolver + Schedule + Webhook, nhưng mẫu tương tự có thể được điều chỉnh cho:

  • trích xuất giá cả và dữ liệu sản phẩm
  • kiểm tra thay đổi tồn kho hoặc nội dung được bảo vệ
  • đăng nhập vào tài khoản của bạn
  • kích hoạt trích xuất mục tiêu cố định từ một dịch vụ khác qua webhook

Bài viết này liên quan đến tự động hóa thực tế, được phép trên các mục tiêu bạn sở hữu, quản lý hoặc được phép kiểm tra.

Lưu ý quan trọng: Các quy trình này là các ví dụ và mẫu ban đầu, không phải công thức chung. Bạn nên kỳ vọng phải thay đổi cài đặt CAPTCHA, phương pháp gửi token, dữ liệu yêu cầu, tiêu đề, cookie, bộ chọn và logic đầu ra để phù hợp với từng trang cụ thể.


Hướng Dẫn Này Xây Dựng Gì

Ví dụ chính trong bài viết này là một mẫu trích xuất mục tiêu cố định hỗ trợ hai chế độ kích hoạt:

  • Lịch trình: chạy tự động mỗi 6 giờ
  • Webhook: kích hoạt cùng mục tiêu được cấu hình theo yêu cầu

Trong mẫu kho lưu trữ mặc định, quy trình này:

  • giải reCAPTCHA v3
  • truy xuất trang sản phẩm được bảo vệ
  • gửi token thông qua tiêu đề x-recaptcha-token
  • trích xuất price và productName
  • so sánh giá trị hiện tại với $workflow.staticData
  • trả về payload thông báo hoặc payload không thay đổi

Mẫu tương tự có thể trở thành:

  • trình trích xuất
  • trình trích xuất chi tiết sản phẩm
  • trình kiểm tra tồn kho
  • quy trình đăng nhập cho tài khoản của bạn

Các Trường Hợp Sử Dụng Thường Gặp

Các mẫu kho lưu trữ này đều tuân theo khung xương khung tái sử dụng:

kích hoạt -> giải CAPTCHA -> gửi yêu cầu được bảo vệ -> trích xuất kết quả -> so sánh/lưu trữ/đầu ra

Cấu trúc này phù hợp với nhiều trường hợp hợp pháp:

Trường hợp sử dụng Điều gì thay đổi
Trích xuất Trích xuất các trường giá và so sánh theo thời gian
Trích xuất dữ liệu sản phẩm Trích xuất các trường như tiêu đề, SKU, người bán, tồn kho hoặc mô tả
Kiểm tra tồn kho So sánh văn bản sẵn có, số lượng hoặc trạng thái nút mua
Đăng nhập vào tài khoản của bạn Gửi token đã giải cùng yêu cầu đăng nhập và xác minh thành công đăng nhập
Truy xuất nội dung được bảo vệ Lấy nội dung bị chặn và trả về các trường đã trích xuất
Trích xuất kích hoạt qua webhook Cho phép dịch vụ khác kích hoạt mục tiêu được cấu hình cố định theo yêu cầu

Cấu trúc vẫn có thể tái sử dụng, nhưng chi tiết triển khai thực tế có thể khác nhau trên mỗi trang. Trên thực tế, người dùng nên coi mỗi quy trình ở đây là ví dụ và sau đó điều chỉnh cài đặt giải CAPTCHA, hình dạng yêu cầu, vị trí token và logic trích xuất để phù hợp với mục tiêu mà họ đang tự động hóa.


Quy Trình: Ví Dụ Trường Hợp Sử Dụng

Quy trình trích xuất chính ở trên lấy nội dung trang gốc và so sánh giá cả. Các quy trình sau mở rộng cùng mẫu giải CAPTCHA — Kích hoạt → Giải CAPTCHA → Gửi Yêu Cầu Được Bảo Vệ → Đánh Giá Kết Quả — cho các trường hợp sử dụng cụ thể. Mỗi quy trình đều yêu cầu các điều kiện tiên quyết giống nhau: một phiên bản n8n, một tài khoản CapSolver, và các tham số CAPTCHA của trang đích.

Quy trình Mục đích
Scraping — Price & Product Details — CapSolver + Schedule + Webhook Mẫu lịch trình + webhook mục tiêu cố định giải reCAPTCHA v3, gửi token trong x-recaptcha-token, trích xuất price và productName, so sánh giá trị với $workflow.staticData, và có thể được sử dụng để trích xuất, trích xuất chi tiết sản phẩm hoặc kiểm tra trang sản phẩm được bảo vệ tương tự

Lưu ý kích hoạt: Mẫu này được nhập vào với active: false. Đường dẫn webhook không hoạt động cho đến khi bạn cấu hình các chỗ trống, chọn tài khoản CapSolver của bạn và kích hoạt quy trình trong n8n.


Điều Kiện Tiên Quyết

Trước khi bắt đầu, hãy đảm bảo bạn có:

  1. Một phiên bản n8n
  2. Tài khoản CapSolver với khóa API và số dư
  3. Nút CapSolver đã được cấu hình trong n8n
  4. Một URL đích và các trường bạn muốn trích xuất
  5. Các tham số CAPTCHA yêu cầu bởi trang đích đó
  6. Hiểu rõ cách yêu cầu được bảo vệ thực sự được gửi từ trình duyệt

Đối với ví dụ chính trong bài viết này, mục tiêu được giả định sử dụng reCAPTCHA, do đó các giá trị khóa là:

  • websiteURL
  • websiteKey
  • pageAction cho reCAPTCHA v3

Lưu ý quan trọng: Hướng dẫn nhận diện tham số dưới đây được giới hạn chủ ý cho các ví dụ reCAPTCHA. Các mục tiêu thực tế có thể sử dụng loại thử thách khác hoàn toàn — như Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF hoặc MTCaptcha — và trong trường hợp đó, cấu hình nút giải CAPTCHA, các trường bắt buộc và mẫu yêu cầu được bảo vệ sẽ khác nhau.


Cách Xác Định Tham Số reCAPTCHA

Đối với các trang được bảo vệ bởi reCAPTCHA, các giá trị cốt lõi thường là:

Tham số Ý nghĩa
websiteURL URL nơi CAPTCHA được hiển thị hoặc yêu cầu
websiteKey Khóa công khai được trang sử dụng
pageAction Chuỗi hành động được reCAPTCHA v3 mong đợi

Trong mẫu giám sát giá của kho lưu trữ, nút CapSolver được cấu hình với:

  • operation: reCAPTCHA v3
  • websiteURL: https://YOUR-TARGET-SITE.com/product-page
  • websiteKey: YOUR_SITE_KEY_HERE
  • pageAction: view_product

Khi bạn kiểm tra một trang mục tiêu reCAPTCHA, hãy xác minh:

  • phiên bản reCAPTCHA mà nó sử dụng
  • xem pageAction có bắt buộc không
  • nơi token đã giải thực sự được gửi

Lưu ý quan trọng: Đây không phải là phần phát hiện CAPTCHA phổ quát. Nếu mục tiêu sử dụng loại thử thách khác — như Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF hoặc MTCaptcha — bạn sẽ cần thay đổi cả cài đặt CapSolver và yêu cầu HTTP gửi token đã giải.


Quy Trình Chính: Scraping — Price & Product Details — CapSolver + Schedule + Webhook

Quy trình kho lưu trữ Scraping — Price & Product Details — CapSolver + Schedule + Webhook hiện hỗ trợ hai đường kích hoạt mục tiêu cố định:

  • Every 6 Hours cho các kiểm tra định kỳ
  • Webhook Trigger cho các chạy theo yêu cầu

Cả hai đường đều sử dụng cùng các mẫu mục tiêu và logic trích xuất. Phiên bản webhook chỉ kết thúc ở Respond to Webhook để người gọi nhận được payload thông báo hoặc không thay đổi cuối cùng dưới dạng JSON.

Đường Dẫn Lịch Trình

Đường dẫn lịch trình sử dụng các nút sau:

  1. Every 6 Hours
  2. Solve reCAPTCHA v3
  3. Fetch Product Page
  4. Extract Data
  5. Compare Data
  6. Data Changed?
  7. Build Alert
  8. No Change

Đường Dẫn Webhook

Đường dẫn webhook lặp lại cùng logic cho cùng mục tiêu cố định:

  1. Webhook Trigger
  2. Solve reCAPTCHA v3 [Webhook]
  3. Fetch Product Page [Webhook]
  4. Extract Data [Webhook]
  5. Compare Data [Webhook]
  6. Data Changed? [Webhook]
  7. Build Alert [Webhook]
  8. No Change [Webhook]
  9. Respond to Webhook

Cách Hoạt Động Của Logic Chính

1. Kích hoạt

Sử dụng lịch trình khi bạn muốn kiểm tra định kỳ, ví dụ như trích xuất hoặc kiểm tra tồn kho.

Sử dụng webhook khi một quy trình, dịch vụ hoặc ứng dụng khác nên kích hoạt cùng mục tiêu được cấu hình theo yêu cầu.

2. Giải reCAPTCHA v3

Mẫu sử dụng:

Cài đặt Giá trị
Operation reCAPTCHA v3
websiteURL https://YOUR-TARGET-SITE.com/product-page
websiteKey YOUR_SITE_KEY_HERE
pageAction view_product

3. Truy xuất Trang Được Bảo Vệ

Token đã giải được gửi trong tiêu đề yêu cầu:

Tiêu đề Giá trị
user-agent Người dùng kiểu trình duyệt
x-recaptcha-token {{ $json.data.solution.gRecaptchaResponse }}

Đây là một trong những chi tiết quan trọng nhất trong quy trình. Mẫu kho lưu trữ không giả định token luôn thuộc về g-recaptcha-response. Trong ví dụ này, nó đi vào tiêu đề tùy chỉnh.

4. Trích xuất price và productName

Nút HTML trích xuất:

Khóa Bộ chọn CSS
price .product-price, [data-price], .price
productName h1, .product-title

5. So Sánh Với Các Lần Chạy Trước

Nút Code lưu trữ và so sánh giá trị bằng cách sử dụng:

  • $workflow.staticData.lastPrice
  • $workflow.staticData.lastChecked

Điều này cho phép quy trình phân biệt giữa:

  • lần kiểm tra đầu tiên
  • không thay đổi
  • giá tăng
  • giá giảm

6. Nhánh Vào Thông Báo Hoặc Không Thay Đổi

Nút IF kiểm tra {{ $json.changed }}.

Nếu giá thay đổi, quy trình đi đến Build Alert.

Nếu không, nó đi đến No Change.

Trên đường dẫn webhook, nhánh nào cũng đi vào Respond to Webhook.


Tại Sao Điều Này Thực Sự Là Một Mẫu Trình Trích Xuất

Mặc dù ví dụ chính bao gồm logic so sánh giá, nó hữu ích hơn khi xem như một mẫu trích xuất trang sản phẩm được bảo vệ với logic so sánh.

Các phần có thể tái sử dụng là:

  • chế độ kích hoạt
  • loại CAPTCHA
  • cài đặt giải
  • yêu cầu được bảo vệ
  • bộ chọn trích xuất
  • logic so sánh hoặc đầu ra

Đó là lý do tại sao cùng cấu trúc có thể thúc đẩy:

  • trích xuất
  • trích xuất chi tiết sản phẩm
  • kiểm tra tồn kho
  • xác minh trang được bảo vệ
  • kiểm tra đăng nhập cho tài khoản của bạn

Những Gì Bạn Sẽ Cần Thay Đổi

Đây là phần quan trọng nhất trên một mục tiêu thực tế.

Đối với hầu hết các trang thực tế, bạn nên giả định rằng gần như mọi thứ ở đây đều có thể điều chỉnh: loại thử thách, tham số giải, nơi token được gửi, dữ liệu yêu cầu, cookie, tiêu đề, bộ chọn và ngay cả tiêu chí thành công cuối cùng. Các quy trình kho lưu trữ này là các mẫu có thể hoạt động, không phải công thức cố định sẽ phù hợp với mọi trang mà không thay đổi.

1. Chế độ Kích Hoạt

Các quy trình trường hợp sử dụng của kho lưu trữ hiện hỗ trợ lịch trình + webhook.

Sử dụng:

  • lịch trình cho các kiểm tra định kỳ
  • webhook cho kích hoạt theo yêu cầu từ một dịch vụ khác

Các đường dẫn webhook trong các mẫu này là kích hoạt mục tiêu cố định, không phải API công khai cho các mục tiêu do người dùng cung cấp.

2. Loại CAPTCHA

Ví dụ giám sát giá chính sử dụng reCAPTCHA v3, nhưng mục tiêu của bạn có thể sử dụng:

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • GeeTest V3 / V4
  • DataDome
  • AWS WAF
  • MTCaptcha
  • loại thử thách được hỗ trợ khác

Nếu điều này thay đổi, bạn sẽ cần cập nhật bước giải tương ứng.

3. Cài Đặt Giải CAPTCHA

Ngay cả khi hai trang đều sử dụng reCAPTCHA, cài đặt có thể khác nhau.

Bạn có thể cần thay đổi:

  • operation hoặc loại nhiệm vụ của CapSolver
  • websiteURL
  • websiteKey
  • pageAction
  • các tùy chọn liên quan đến không hiển thị/enterprise
  • bất kỳ cài đặt thử thách cụ thể nào khác của trang

Mẫu trích xuất mở ra các trường cấu hình này dưới dạng chỗ trống vì chúng được kỳ vọng sẽ thay đổi.

4. Nơi Token Được Gửi

Đừng giả định token luôn đi vào cùng một vị trí.

Mẫu này đã hiển thị một số mẫu:

Mẫu Ví dụ kho lưu trữ
Tiêu đề yêu cầu Scraping — CapSolver + Schedule sử dụng x-recaptcha-token
Nội dung biểu mẫu Các quy trình đăng nhập thường sử dụng g-recaptcha-response trong nội dung dạng biểu mẫu

Trên các trang thực tế, token đã giải có thể thuộc về:

  • tiêu đề
  • trường biểu mẫu
  • dữ liệu JSON
  • tham số truy vấn
  • cookie
  • trường ẩn
  • giá trị cụ thể của ứng dụng khác

Mẫu này là một mẫu gửi, không phải mẫu phổ quát.

5. Yêu Cầu Được Bảo Vệ Bản Thân

Yêu cầu được bảo vệ có thể yêu cầu nhiều hơn chỉ token CAPTCHA hoặc thử thách.

Bạn có thể cần điều chỉnh:

  • tiêu đề
  • cookie
  • giá trị CSRF
  • trường ẩn
  • mã hóa biểu mẫu
  • hình dạng dữ liệu JSON
  • phương pháp yêu cầu

Điều này đặc biệt phổ biến đối với:

  • quy trình đăng nhập
  • các biểu mẫu thanh toán hoặc được bảo vệ

6. Những Gì Bạn Trích Xuất

Mẫu trích xuất chính trích xuất:

  • price
  • productName

Nhưng bạn có thể thay thế bằng:

  • tiêu đề
  • trạng thái tồn kho
  • SKU
  • mô tả
  • giá trị biến thể
  • văn bản khả dụng
  • các khối nội dung được bảo vệ đầy đủ

7. Những Gì Bạn So Sánh Hoặc Đầu Ra

Mã giám sát giá hiện tại so sánh các giá trị số, nhưng cùng mẫu có thể được điều chỉnh cho:

  • thay đổi giá
  • thay đổi tồn kho
  • thành công đăng nhập
  • thành công đăng ký
  • khác biệt nội dung
  • trạng thái sức khỏe trang web
  • xuất dữ liệu thô mà không so sánh

Nhập Quy Trình Này

JSON dưới đây là phiên bản có thể nhập của Scraping — Price & Product Details — CapSolver + Schedule + Webhook từ kho lưu trữ này, bao gồm cả các đường kích hoạt lịch trình + webhook.

Bấm để mở rộng JSON quy trình
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## Scraping \u2014 Price & Product Monitor\n\n### How it works\n\n1. Triggers either by schedule or webhook input to start price monitoring.\n2. Solves reCAPTCHA to access the targeted product page.\n3. Retrieves and extracts data from the product page for further analysis.\n4. Compares newly fetched data with previously stored data to detect changes.\n5. Determines if changes occurred and prepares alerts if needed.\n6. Sends responses based on data analysis through designated channels.\n\n### Setup steps\n\n- [ ] Configure scheduled trigger interval in 'Every 6 Hours' node.\n- [ ] Set target website details in 'Set Target Config [Schedule]'.\n- [ ] Configure reCAPTCHA solver with API key in 'Solve reCAPTCHA v3' nodes.\n- [ ] Set up Webhook URL and path in 'Webhook Trigger'.\n- [ ] Define alert criteria and destination in 'Build Alert' nodes.\n\n### Customization\n\nAdjust the extraction pattern in 'Extract Data' nodes to fit specific product details.",
        "height": 896,
        "width": 480
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1328,
        -304
      ],
      "id": "52c7808e-d2bc-4779-85e6-909a51066338",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## Scheduled trigger setup\n\nInitializes the data monitoring process every 6 hours using a schedule trigger and sets the target configuration for scraping.",
        "height": 320,
        "width": 496,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -752,
        -160
      ],
      "id": "3c5cee67-552d-48ea-8717-7c5126269e2e",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
"content": "## Quy trình thu thập dữ liệu định kỳ\n\nGiải quyết reCAPTCHA, tải trang sản phẩm, trích xuất dữ liệu và so sánh với các bản ghi trước để phát hiện thay đổi, theo một sự kích hoạt định kỳ.",
        "height": 496,
        "width": 1680,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -144,
        -304
      ],
      "id": "d0315be2-111c-4893-bf42-2f2cc2eb186f",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "## Cài đặt kích hoạt Webhook\n\nXử lý theo dõi dữ liệu được kích hoạt thủ công thông qua Webhook đến và giải quyết reCAPTCHA để tiếp tục.",
        "height": 304,
        "width": 816,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -768,
        336
      ],
      "id": "a78f1606-07fb-40fd-af82-e1dc9b766206",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "## Quy trình thu thập dữ liệu Webhook\n\nXử lý các yêu cầu được kích hoạt bởi Webhook bằng cách tải trang sản phẩm, trích xuất dữ liệu và xác định các thay đổi.",
        "height": 272,
        "width": 1088,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        160,
        320
      ],
      "id": "1a677fd9-a3a8-404f-ba9a-2b087d7bfe11",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -704,
        0
      ],
      "id": "sc-901",
      "name": "Mỗi 6 giờ"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-001",
              "name": "websiteURL",
              "value": "https://YOUR-TARGET-SITE.com/trang-san-phẩm",
              "type": "string"
            },
            {
              "id": "cfg-002",
              "name": "websiteKey",
              "value": "YOUR_SITE_KEY_HERE",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -400,
        0
      ],
      "id": "sc-900",
      "name": "Thiết lập Cấu hình Mục tiêu [Kế hoạch]"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v3",
        "websiteURL": "={{ $json.websiteURL }}",
        "websiteKey": "={{ $json.websiteKey }}",
        "optional": {
          "pageAction": "xem_sản_phẩm"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "sc-902",
      "name": "Giải quyết reCAPTCHA v3",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "Tài khoản CapSolver"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Thiết lập Cấu hình Mục tiêu [Kế hoạch]').first().json.websiteURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "x-recaptcha-token",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {}
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "sc-903",
      "name": "Lấy Trang Sản phẩm"
    },
    {
      "parameters": {
        "operation": "trích xuấtNội dungHTML",
        "extractionValues": {
          "values": [
            {
              "key": "giá",
              "cssSelector": ".product-price, [data-price], .price"
            },
            {
              "key": "tênSảnPhẩm",
              "cssSelector": "h1, .product-title"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        0
      ],
      "id": "sc-904",
      "name": "Trích xuất Dữ liệu"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.giá;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.tênSảnPhẩm || 'Sản phẩm';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'giảm' : 'tăng') : 'không thay đổi';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'lần kiểm tra đầu tiên', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        0
      ],
      "id": "sc-905",
      "name": "So sánh Dữ liệu"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "if-1",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1104,
        0
      ],
      "id": "sc-906",
      "name": "Dữ liệu Thay đổi?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "thông báo",
              "value": "=Giá {{ $json.direction }} cho {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "mức_độ",
              "value": "={{ $json.direction === 'giảm' ? 'khuyến mãi' : 'thông tin' }}",
              "type": "string"
            },
            {
              "id": "a3",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1392,
        -192
      ],
      "id": "sc-907",
      "name": "Xây dựng Thông báo"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "n1",
              "name": "trạng thái",
              "value": "không_thay_đổi",
              "type": "string"
            },
            {
              "id": "n2",
              "name": "giáHiệnTại",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "n3",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1392,
        32
      ],
      "id": "sc-908",
      "name": "Không Thay đổi"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "theo_dõi_giá",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -720,
        464
      ],
      "id": "sc-909",
      "name": "Kích hoạt Webhook",
      "webhookId": "sc-909-webhook",
      "onError": "tiếp_tục_output_thường"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v3",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "websiteKey": "={{ $json.body.websiteKey }}",
        "optional": {
          "pageAction": "={{ $json.body.pageAction || 'xem_sản_phẩm' }}"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        464
      ],
      "id": "sc-910",
      "name": "Giải quyết reCAPTCHA v3 [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "Tài khoản CapSolver"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Kích hoạt Webhook').item.json.body.websiteURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "x-recaptcha-token",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {}
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        432
      ],
      "id": "sc-911",
      "name": "Lấy Trang Sản phẩm [Webhook]"
    },
    {
      "parameters": {
        "operation": "trích xuấtNội dungHTML",
        "extractionValues": {
          "values": [
            {
              "key": "giá",
              "cssSelector": ".product-price, [data-price], .price"
            },
            {
              "key": "tênSảnPhẩm",
              "cssSelector": "h1, .product-title"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        432
      ],
      "id": "sc-912",
      "name": "Trích xuất Dữ liệu [Webhook]"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.giá;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.tênSảnPhẩm || 'Sản phẩm';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'giảm' : 'tăng') : 'không thay đổi';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'lần kiểm tra đầu tiên', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        432
      ],
      "id": "sc-913",
      "name": "So sánh Dữ liệu [Webhook]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "if-2",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1104,
        432
      ],
      "id": "sc-914",
      "name": "Dữ liệu Thay đổi? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a4",
              "name": "thông báo",
              "value": "=Giá {{ $json.direction }} cho {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "a5",
              "name": "mức_độ",
              "value": "={{ $json.direction === 'giảm' ? 'khuyến mãi' : 'thông tin' }}",
              "type": "string"
            },
            {
              "id": "a6",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1424,
        384
      ],
      "id": "sc-915",
      "name": "Xây dựng Thông báo [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "n4",
              "name": "trạng thái",
              "value": "không_thay_đổi",
              "type": "string"
            },
            {
              "id": "n5",
              "name": "giáHiệnTại",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "n6",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1440,
        592
      ],
      "id": "sc-916",
      "name": "Không Thay đổi [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1712,
        512
      ],
      "id": "sc-917",
      "name": "Trả lời Webhook"
    }
  ],
  "connections": {
    "Mỗi 6 giờ": {
      "main": [
        [
          {
"node": "Thiết lập Cấu hình Mục tiêu [Lịch trình]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Thiết lập Cấu hình Mục tiêu [Lịch trình]": {
      "main": [
        [
          {
            "node": "Giải reCAPTCHA v3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Giải reCAPTCHA v3": {
      "main": [
        [
          {
            "node": "Lấy Trang Sản phẩm",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lấy Trang Sản phẩm": {
      "main": [
        [
          {
            "node": "Trích xuất Dữ liệu",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trích xuất Dữ liệu": {
      "main": [
        [
          {
            "node": "So sánh Dữ liệu",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "So sánh Dữ liệu": {
      "main": [
        [
          {
            "node": "Dữ liệu đã thay đổi?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dữ liệu đã thay đổi?": {
      "main": [
        [
          {
            "node": "Xây dựng Thông báo",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Không Có Thay Đổi",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Giải reCAPTCHA v3 [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Giải reCAPTCHA v3 [Webhook]": {
      "main": [
        [
          {
            "node": "Lấy Trang Sản phẩm [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lấy Trang Sản phẩm [Webhook]": {
      "main": [
        [
          {
            "node": "Trích xuất Dữ liệu [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trích xuất Dữ liệu [Webhook]": {
      "main": [
        [
          {
            "node": "So sánh Dữ liệu [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "So sánh Dữ liệu [Webhook]": {
      "main": [
        [
          {
            "node": "Dữ liệu đã thay đổi? [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dữ liệu đã thay đổi? [Webhook]": {
      "main": [
        [
          {
            "node": "Xây dựng Thông báo [Webhook]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Không Có Thay Đổi [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Xây dựng Thông báo [Webhook]": {
      "main": [
        [
          {
            "node": "Phản hồi cho Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Không Có Thay Đổi [Webhook]": {
      "main": [
        [
          {
            "node": "Phản hồi cho Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}

Thử nghiệm

Sau khi cấu hình các placeholder và kích hoạt workflow, kích hoạt đường dẫn webhook:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/price-monitor \
  -H "Content-Type: application/json" \
  -d '{}'

Phản hồi mong đợi (lần kiểm tra đầu tiên):

json Copy
{
  "status": "không_thay_đổi",
  "currentPrice": "$29.99",
  "checkedAt": "2026-03-11T08:00:00.000Z"
}

Phản hồi mong đợi (giá thay đổi):

json Copy
{
  "alert": "Giá đã giảm cho Widget Pro: $39.99 → $29.99 (-$10.00)",
  "severity": "deal",
  "checkedAt": "2026-03-11T14:00:00.000Z"
}

Một phản hồi với dữ liệu giá thực tế xác nhận rằng toàn bộ quy trình hoạt động — captcha đã được giải, trang bị bảo vệ đã được lấy, dữ liệu đã được trích xuất và logic so sánh đã chạy.


Giải quyết sự cố

Token đã giải, Vẫn bị chặn

Nếu CapSolver trả về token nhưng trang web vẫn chặn yêu cầu, vấn đề thường không phải ở việc giải captcha. Các nguyên nhân phổ biến:

  • loại captcha sai
  • cài đặt giải sai
  • pageAction sai
  • token được gửi ở vị trí sai
  • thiếu cookie, tiêu đề hoặc trường ẩn

Trang web Sử dụng Loại Thách Thức Khác

Nếu trang đích sử dụng thách thức không phải reCAPTCHA — như Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF, hoặc MTCaptcha — ví dụ chính sẽ không hoạt động mà không thay đổi. Bạn cần cập nhật:

  • cấu hình node CapSolver
  • tham số thách thức mong đợi
  • yêu cầu bảo vệ gửi token

Chọn Lọc Trả về Không Có Gì

Nếu node HTML không trích xuất các trường bạn mong đợi:

  • kiểm tra xem bạn có thực sự nhận được trang bị bảo vệ không
  • xác nhận các chọn lọc với HTML trả về
  • đảm bảo dữ liệu tồn tại trong phản hồi thô và không chỉ sau khi render phía client

Webhook Không Hoạt Động

Các mẫu repo được nhập với trạng thái không hoạt động. Cho đến khi bạn:

  1. cấu hình các placeholder
  2. chọn thông tin xác thực
  3. kích hoạt workflow

đường dẫn webhook sẽ không hoạt động.


Nguyên Tắc Tốt

  1. Sử dụng token ngay sau khi giải nó.
  2. Kiểm tra yêu cầu trình duyệt chính xác trước khi sao chép vào n8n.
  3. Giả định mỗi mục tiêu có thể cần cài đặt giải khác nhau.
  4. Giả định mỗi mục tiêu có thể cần logic gửi khác nhau.
  5. Xác minh phản hồi được bảo vệ trước khi gỡ lỗi chọn lọc.
  6. Xem các mẫu repo như điểm bắt đầu, không phải là giải pháp phổ quát.
  7. Giữ các mẫu webhook cố định cho mục tiêu cụ thể trừ khi bạn có lý do để mở rộng hơn.
  8. Kiểm tra chu trình giải -> gửi -> trích xuất đầy đủ, không chỉ bước giải captcha.
  9. Thêm các node thông báo hoặc lưu trữ phía sau Xây dựng Thông báo hoặc node xác thực thành công/thất bại.

Sẵn sàng bắt đầu chưa? Đăng ký CapSolver và sử dụng mã thưởng OPENCLAW để nhận thêm 6% thưởng cho lần nạp đầu tiên!


Kết luận

Thông điệp chính là đơn giản: giải captcha chỉ là một bước trong quy trình. Người quét thực sự vẫn phải gửi token đúng cách, gửi đúng định dạng yêu cầu và trích xuất các trường quan trọng cho trường hợp sử dụng của bạn.

Đó cũng là lý do tại sao các mẫu này nên được xem như ví dụ. Một trang web khác có thể sử dụng loại captcha khác, kỳ vọng token ở nơi khác, cần cookie hoặc trường bổ sung, trả về định dạng phản hồi khác nhau và yêu cầu logic trích xuất hoặc xác minh khác nhau.

Mẫu này cung cấp điểm bắt đầu cho:

  • quét hoặc trích xuất dữ liệu
  • giám sát sản phẩm
  • kiểm tra tồn kho
  • truy xuất nội dung được bảo vệ

Nó sử dụng mô hình chung:

kích hoạt -> giải captcha -> gửi yêu cầu được bảo vệ -> trích xuất hoặc xác minh kết quả -> đầu ra

Cấu hình các placeholder, giữ workflow ở trạng thái không hoạt động cho đến khi chúng khớp với mục tiêu của bạn, sau đó kích hoạt đường dẫn lịch trình hoặc webhook phù hợp với trường hợp sử dụng của bạn.


Câu Hỏi Thường Gặp

Tôi có thể sử dụng này để đăng nhập vào tài khoản của mình không?

Mẫu quét có thể được điều chỉnh cho luồng đăng nhập bằng cách thay đổi node HTTP Request để gửi thông tin đăng nhập cùng với token đã giải. Xem các hướng dẫn riêng cho từng loại captcha (reCAPTCHA, Turnstile, v.v.) để có các mẫu luồng đăng nhập sẵn có.

Trang web sử dụng loại thách thức khác thì sao?

Khi đó bạn phải thay đổi workflow. Cài đặt và mẫu yêu cầu của ví dụ chính không phải là phổ quát. CapSolver hỗ trợ Cloudflare Turnstile, Cloudflare Challenge, GeeTest V3/V4, DataDome, AWS WAF, MTCaptcha và các loại khác. Cập nhật bước giải CapSolver và yêu cầu được bảo vệ để phù hợp với loại thách thức và mẫu gửi token thực tế của trang đích.

Tôi nên gửi token ở đâu?

Nơi mà trang đích kỳ vọng. Đó có thể là:

  • một tiêu đề
  • một phần thân form
  • một tải trọng JSON
  • một tham số truy vấn
  • một cookie
  • một trường ẩn

Mẫu giám sát giá sử dụng một tiêu đề. Các trang khác sẽ khác nhau.

Tôi có cần thay đổi cài đặt CapSolver cho mỗi trang không?

Thông thường thì có. Ngay cả các trang sử dụng cùng gia đình captcha cũng có thể yêu cầu websiteURL, websiteKey, pageAction, cài đặt ẩn, hoặc các tùy chọn khác khác nhau.

Tôi có thể quét thứ gì đó khác ngoài giá không?

Có. Thay các chọn lọc và logic đầu ra cho những gì bạn cần, như tồn kho, tiêu đề, SKU, mô tả, nội dung bị bảo vệ, trạng thái đăng nhập, hoặc tín hiệu về tình trạng trang web.

Làm thế nào để biết yêu cầu tải trọng hoặc chọn lọc có sai không?

Bắt đầu bằng cách kiểm tra phản hồi được bảo vệ trả về bởi node HTTP Request.

  • Nếu phản hồi vẫn bị chặn hoặc không đầy đủ, định dạng yêu cầu có thể sai.
  • Nếu phản hồi đúng nhưng trích xuất thất bại, chọn lọc hoặc logic phân tích có thể sai.

Gỡ lỗi workflow theo thứ tự này: giải -> gửi -> kiểm tra phản hồi -> trích xuất.

Xem thêm

n8nMar 09, 2026

Cách Giải reCAPTCHA v2/v3 Sử Dụng CapSolver và n8n

Xây dựng API giải eCAPTCHA v2/v3 bằng CapSolver và n8n. Tìm hiểu cách tự động hóa việc giải token, gửi token đến website và trích xuất dữ liệu được bảo vệ mà không cần lập trình.

Anh Tuan
Anh Tuan
Apr 22, 2026

Trí tuệ nhân tạo tốt nhất để giải các câu đố hình ảnh: Các công cụ và chiến lược hàng đầu cho năm 2026

Khám phá AI tốt nhất để giải các câu đố hình ảnh. Học cách Vision Engine và APIs ImageToText của CapSolver tự động hóa các thách thức thị giác phức tạp với độ chính xác cao.

Anh Tuan

Nội dung

Anh Tuan
web scrapingApr 22, 2026

Kiến trúc Trích xuất Dữ liệu Từ Web bằng Rust cho Trích xuất Dữ liệu Có Thể Mở Rộng

Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Anh Tuan
Anh Tuan
Apr 22, 2026

API Tìm kiếm so với Chuỗi cung ứng tri thức: Hướng dẫn cơ sở hạ tầng dữ liệu AI

Học cách các công cụ API tìm kiếm, chuỗi cung ứng kiến thức, quy trình API SERP và dòng dữ liệu AI định hình cơ sở hạ tầng dữ liệu web hiện đại cho AI.

Anh Tuan
Anh Tuan
Blog
All