🎯 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

Xây dựng Trình theo dõi hạng với Scrapeless Deep SerpApi

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

29-Jun-2026

Tóm tắt:

  • Một công cụ theo dõi thứ hạng là một vòng lặp, không phải là một bảng tính. Truy vấn Google cho mỗi từ khóa, đọc vị trí tự nhiên, tìm vị trí của miền của bạn, và ghi lại số đó theo lịch trình — đó là toàn bộ máy móc.
  • Phần khó khăn là có được SERP sạch, có thể phân tích. Google cá nhân hóa và giới hạn tốc độ kết quả, vì vậy một công cụ theo dõi thứ hạng cần một nguồn tìm kiếm trả về organic_results có cấu trúc với positionlink ổn định trong mỗi lần gọi.
  • Scrapeless Deep SerpApi trả về kết quả Google dưới dạng JSON. Một POST với {"q": "<từ khóa>"} chống lại tác nhân scraper.google.search trả về một mảng organic_results — mỗi mục mang một position và một link, mà đó là tất cả những gì một công cụ theo dõi thứ hạng cần để khớp với miền của bạn.
  • Khớp miền là so sánh máy chủ, không phải tìm kiếm chuỗi. Phân tích link của mỗi kết quả đến máy chủ của nó, loại bỏ www., và so sánh với miền mục tiêu của bạn — do đó blog.yourdomain.comyourdomain.com/path đều được tính là một hit.
  • Ảnh chụp theo thời gian biến vị trí thành các delta. Lưu mỗi lần chạy theo ngày, sau đó so sánh hôm nay với lần chạy được lưu gần nhất để xem từ khóa nào đã lên, giảm, hoặc hoàn toàn rút khỏi kết quả.
  • Miễn phí để bắt đầu. Các tài khoản Scrapeless mới bao gồm tín dụng Deep SerpApi miễn phí — hãy đăng ký tại app.scrapeless.com và chạy công cụ theo dõi trong hướng dẫn này với bộ từ khóa của riêng bạn.

Giới thiệu: xây dựng công cụ theo dõi thứ hạng, đừng thuê nó

Thứ hạng tìm kiếm là một vị trí trong danh sách. Đối với một từ khóa nhất định, miền của bạn đứng ở vị trí tự nhiên 3, hoặc 11, hoặc không có mặt trong trang đầu tiên — và số đó thay đổi khi Google tái xếp hạng và khi đối thủ phát hành. Theo dõi nó là sự khác biệt giữa việc biết một trang đã giảm từ 4 xuống 9 tuần trước và phát hiện ra khi lưu lượng truy cập đã đi xuống.

Hầu hết các hướng dẫn "xây dựng công cụ theo dõi thứ hạng" đều kết thúc ở một Google Sheet mà bạn cập nhật bằng tay, hoặc một công thức lấy thông tin từng ô một và bị hỏng ngay khi Google thay đổi markup của mình. Điều đó hoạt động cho năm từ khóa được kiểm tra một lần mỗi tháng. Nó không mở rộng đến một bộ từ khóa mà bạn thực sự quan tâm, và nó không cung cấp cho bạn lịch sử để so sánh.

Hướng dẫn này xây dựng một công cụ theo dõi thứ hạng thực sự, lập trình bằng Python trên nền tảng Scrapeless Deep SerpApi. API trả về kết quả tự nhiên của Google dưới dạng JSON có cấu trúc, vì vậy công cụ theo dõi vẫn nhỏ: truy vấn một từ khóa, phân tích các vị trí, khớp với miền của bạn, lưu ảnh chụp, và so sánh các lần chạy để tính toán sự di chuyển. Đến cuối bạn có một đoạn mã mà bạn có thể chỉ về bất kỳ bộ từ khóa nào và chạy theo lịch trình.


Những gì bạn có thể làm với một công cụ theo dõi thứ hạng lập trình

  • Theo dõi một bộ từ khóa theo lịch trình. Chạy cùng một đoạn mã hàng ngày hoặc hàng tuần trên hàng chục từ khóa và xây dựng lịch sử vị trí mà không cần chạm vào trình duyệt.
  • Theo dõi sự phân bố từ khóa của một trang duy nhất. Chỉ định công cụ theo dõi đến các từ khóa mục tiêu của một URL và xem các thuật ngữ nào mà nó xếp hạng và ở đâu.
  • Phát hiện sự giảm trước khi lưu lượng truy cập giảm. Một vị trí di chuyển từ 5 xuống 14 là tín hiệu bạn có thể hành động ngay trong ngày đó, chứ không phải vào cuối tháng.
  • So sánh thứ hạng khu vực. Từ khóa giống nhau xếp hạng khác nhau theo từng quốc gia, vì vậy một công cụ theo dõi mà thay đổi tham số gl sẽ cho bạn vị trí trên mỗi thị trường.
  • Đưa thứ hạng vào các bảng điều khiển của riêng bạn. Bởi vì mỗi kết quả là JSON, dữ liệu vị trí trực tiếp đổ vào cơ sở dữ liệu, sổ tay, hoặc công việc báo cáo mà không cần bất kỳ phần glue nào để lấy thông tin.
  • Kiểm toán một cuộc di cư hoặc thiết kế lại. Ảnh chụp thứ hạng trước khi có thay đổi trang và so sánh sau đó, để một sự suy giảm hiện lên dưới dạng danh sách các từ khóa đã bị mất.

Tại sao chọn Scrapeless Deep SerpApi

Scrapeless Deep SerpApi là một đầu cuối tìm kiếm Google được quản lý trả về SERP dưới dạng JSON có cấu trúc thay vì HTML thô. Đặc biệt cho công cụ theo dõi thứ hạng, nó mang lại:

  • organic_results có cấu trúc — mỗi kết quả là một đối tượng với position, title, và link, vì vậy không cần phân tích HTML và không cần CSS selector nào bị hỏng khi Google thay đổi bố cục tiếp theo.
  • Trường position ổn định — API báo cáo thứ hạng của mỗi kết quả tự nhiên, đó là giá trị chính xác mà một công cụ theo dõi thứ hạng ghi nhận.
  • Kiểm soát quốc gia và ngôn ngữ — các tham số glhl cho phép bạn đo lường thứ hạng theo thị trường từ một đầu cuối.
  • Cổng egress dân cư bên trong — các tìm kiếm được thực hiện thông qua proxy dân cư ở hơn 195 quốc gia, vì vậy kết quả phản ánh SERP của một người dùng thực thay vì bị đánh dấu bởi trung tâm dữ liệu.
  • Phản hồi trực tiếp — tác nhân scraper.google.search trả về kết quả ngay trong cùng một yêu cầu, vì vậy công cụ theo dõi đọc JSON trực tiếp mà không cần bước thăm dò.

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


Các yêu cầu tiên quyết

  • Python 3.10 trở lên
  • Thư viện requests (pip install requests)
  • Tài khoản Scrapeless và khóa API — đăng ký tại app.scrapeless.com
  • Một bộ từ khóa và miền mục tiêu mà bạn muốn theo dõi
  • Kiến thức cơ bản về terminal

Đọc khóa API của bạn từ môi trường để nó không bao giờ xuất hiện trong đoạn mã:

bash Copy
```bash
export SCRAPELESS_API_KEY="đặt_mã_token_của_bạn_vào_đây"

Bước 1 — Truy vấn Google với một từ khóa

Đơn vị nhỏ nhất của trình theo dõi là một truy vấn từ khóa. Gửi một yêu cầu POST tới điểm cuối Deep SerpApi với diễn viên scraper.google.search và một đối tượng input mang truy vấn. Trường q là từ khóa; glhl thiết lập quốc gia và ngôn ngữ giao diện để mỗi lần chạy đo cùng một thị trường.

python Copy
import os
import requests

ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"


def search(query, gl="us", hl="en"):
    payload = {
        "actor": "scraper.google.search",
        "input": {"q": query, "gl": gl, "hl": hl},
    }
    response = requests.post(
        ENDPOINT,
        json=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    )
    response.raise_for_status()
    return response.json()


data = search("trình duyệt quét scrapeless")
results = data.get("organic_results", [])
print(f"{len(results)} kết quả hữu cơ")
for result in results[:5]:
    print(result["position"], result["link"])

Phản hồi là một đối tượng JSON được trả về trong một vòng lượt các ngữ nghĩa HTTP; organic_results là mảng mà trình theo dõi đọc. Mỗi phần tử mang một position (cấp bậc trên trang) và một link (URL kết quả). title, snippetsource cũng có mặt, nhưng một trình theo dõi cấp bậc chỉ cần positionlink.


Bước 2 — Phân tích các vị trí hữu cơ

Truy vấn trong Bước 1 trả về đối tượng SERP đầy đủ — kết quả hữu cơ, cộng với quảng cáo, các tìm kiếm liên quan, và video inline khi Google hiển thị chúng. Trình theo dõi chỉ hoạt động với organic_results, và chỉ với hai trường cho mỗi mục. Giảm mỗi kết quả xuống một cặp (position, link) để bước khớp có danh sách sạch để quét.

python Copy
def organic_positions(data):
    pairs = []
    for result in data.get("organic_results", []):
        pairs.append((result["position"], result["link"]))
    return pairs


positions = organic_positions(search("trình duyệt quét scrapeless"))
for position, link in positions:
    print(position, link)

position là cấp bậc mà Google đã gán cho kết quả trên trang đã trả về. Đọc nó trực tiếp từ trường thay vì đếm chỉ mục danh sách, để giá trị luôn đúng ngay cả khi API bỏ qua một loại kết quả hoặc cấu trúc trang thay đổi giữa các lần chạy.


Bước 3 — Khớp miền của bạn với một cấp bậc

Một cấp bậc là position của miền của bạn trong danh sách đó. Việc khớp phải dựa trên máy chủ, không phải là một chuỗi con của URL, vì vậy việc tìm kiếm "yourdomain" trong liên kết thô không khớp sai với đường dẫn của đối thủ cạnh tranh hoặc một chuỗi truy vấn. Phân tích từng link để lấy máy chủ của nó, loại bỏ www. đầu tiên, và coi một miền phụ cũng là một cú hit.

python Copy
from urllib.parse import urlparse


def host_of(url):
    host = urlparse(url).netloc.lower()
    return host[4:] if host.startswith("www.") else host


def rank_of(domain, data):
    domain = domain.lower()
    for result in data.get("organic_results", []):
        host = host_of(result["link"])
        if host == domain or host.endswith("." + domain):
            return result["position"]
    return None


data = search("trình duyệt quét scrapeless")
rank = rank_of("scrapeless.com", data)
print("scrapeless.com:", rank if rank is not None else "không có trong kết quả trả về")

rank_of trả về vị trí đầu tiên mà miền của bạn giữ, hoặc None khi nó không xuất hiện trong các kết quả trả về. Một None là dữ liệu thực — nó có nghĩa là miền không có trên trang mà API đã trả về cho từ khóa đó, và trình theo dõi nên ghi nhận điều đó, không bỏ qua nó.

Nhận mã API của bạn trên gói miễn phí: app.scrapeless.com


Bước 4 — Theo dõi một tập hợp từ khóa và lưu trữ các ảnh chụp

Một từ khóa duy nhất không phải là một trình theo dõi. Chạy quy trình khớp trên một tập hợp từ khóa, đóng dấu kết quả với một ngày, và thêm nó vào một tệp lịch sử. Mỗi ảnh chụp là một lần chạy: một ngày cộng với một bản đồ từ khóa đến vị trí. Lưu trữ chúng dưới dạng một danh sách giúp giữ toàn bộ dòng thời gian ở một nơi cho bước khác biệt.

python Copy
import json
from datetime import date, timezone, datetime
from pathlib import Path

HISTORY = Path("rank_history.json")


def snapshot(domain, keywords):
    ranks = {}
    for keyword in keywords:
        ranks[keyword] = rank_of(domain, search(keyword))
    return {"date": date.today().isoformat(), "domain": domain, "ranks": ranks}


def append_snapshot(snap):
    history = json.loads(HISTORY.read_text()) if HISTORY.exists() else []
    history.append(snap)
    HISTORY.write_text(json.dumps(history, indent=2))
    return history


keywords = [
    "trình duyệt quét scrapeless",
    "api serp sâu scrapeless",
    "trình duyệt chống phát hiện trên đám mây",
]
snap = snapshot("scrapeless.com", keywords)
append_snapshot(snap)
for keyword, position in snap["ranks"].items():
    print(f"{position if position is not None else '—':>3}  {keyword}")

Mỗi lần chạy sẽ thêm một bản snapshot. Tập hợp từ khóa là do bạn xác định; thay thế các thuật ngữ mà một trang dự kiến xếp hạng. Các vị trí trả về None sẽ được viết là null trong lịch sử, vì vậy một từ khóa bị rơi ra khỏi trang là một sự kiện được ghi lại thay vì là một khoảng trống.


Bước 5 — Tính toán sự thay đổi hạng giữa các lần chạy

Lịch sử chỉ hữu ích khi bạn so sánh nó. So sánh bản snapshot mới nhất với bản trước đó cho cùng một miền và phân loại từng từ khóa: cải thiện, rớt, không thay đổi, mới xuất hiện trong hạng, hoặc bị rơi ra. Sự thay đổi là vị trí trước đó trừ vị trí hiện tại, vì vậy một số dương có nghĩa là miền đã được nâng lên trên trang.

python Copy
def deltas(history, domain):
    runs = [s for s in history if s["domain"] == domain]
    if len(runs) < 2:
        return {}
    previous, current = runs[-2]["ranks"], runs[-1]["ranks"]
    report = {}
    for keyword, now in current.items():
        before = previous.get(keyword)
        if now is None and before is not None:
            report[keyword] = "bị rơi ra khỏi kết quả"
        elif now is not None and before is None:
            report[keyword] = f"mới xuất hiện ở {now}"
        elif now is not None and before is not None:
            move = before - now
            report[keyword] = "không thay đổi" if move == 0 else f"{move:+d} (trước là {before}, hiện tại là {now})"
    return report


history = json.loads(HISTORY.read_text())
for keyword, change in deltas(history, "scrapeless.com").items():
    print(f"{keyword}: {change}")

Ở lần chạy đầu tiên không có gì để so sánh, vì vậy deltas trả về rỗng —trình theo dõi chỉ lưu trữ điểm chuẩn. Từ lần chạy thứ hai trở đi, mỗi từ khóa sẽ mang theo một nhãn di chuyển mà bạn có thể định tuyến vào một cảnh báo, một bảng điều khiển, hoặc một báo cáo hàng tuần. Lên lịch cặp Bước 4 + Bước 5 với cron hoặc một công việc CI và trình theo dõi hạng sẽ tự chạy.


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

Tập tin lịch sử là đầu ra của trình theo dõi: một bản snapshot cho mỗi lần chạy, mỗi bản đều là một ngày cộng với bản đồ từ khóa tới vị trí. Hình dạng dưới đây chính xác là những gì append_snapshot ghi lại.

json Copy
// mẫu minh họa — định dạng chính xác là những gì append_snapshot ghi lại; các giá trị trường là minh họa.
[
  {
    "date": "2026-06-16",
    "domain": "yourdomain.com",
    "ranks": {
      "từ khóa chính của bạn": 4,
      "từ khóa phụ của bạn": 11,
      "một từ khóa bạn chưa xếp hạng": null
    }
  },
  {
    "date": "2026-06-23",
    "domain": "yourdomain.com",
    "ranks": {
      "từ khóa chính của bạn": 2,
      "từ khóa phụ của bạn": 9,
      "một từ khóa bạn chưa xếp hạng": 18
    }
  }
]

Một vài ghi nhận chân thật từ các lần chạy từ khóa trực tiếp:

  • Số lượng vị trí đến từ trường position của API. Đọc chúng trực tiếp; không suy luận hạng từ chỉ số mảng, vì kết quả trả về có sự thay đổi giữa các lần chạy.
  • Số lượng kết quả tự nhiên thay đổi theo truy vấn. Một từ khóa có thể trả về sáu kết quả tự nhiên ở một lần chạy và tám trong lần khác, vì vậy một None cho miền xếp hạng sâu có thể đơn giản có nghĩa là nó ở dưới tập hợp trả về trong ngày hôm đó.
  • snippet_highlighted_words là điều kiện. Một số kết quả có nó và một số không có; một trình theo dõi hạng bỏ qua nó, nhưng bất kỳ thứ gì đọc các trường khác nên xem chúng như có thể là null.
  • Quốc gia rất quan trọng. Cùng một từ khóa xếp hạng khác nhau theo giá trị gl, vì vậy hãy gán một quốc gia cho mỗi từ khóa được theo dõi và giữ cho nó không thay đổi giữa các lần chạy để so sánh tương đồng.

Kết luận: mở rộng đường ống theo dõi hạng của bạn

Một trình theo dõi hạng giảm xuống còn năm bước: truy vấn một từ khóa, phân tích các vị trí tự nhiên, khớp miền của bạn trên máy chủ, lưu trữ một bản snapshot có ngày, và so sánh với lần chạy trước. Dựa trên Deep SerpApi, mỗi bước đó đọc một mảng organic_results có cấu trúc thay vì phải đối phó với HTML của Google, vì vậy toàn bộ trình theo dõi vẫn nằm dưới một trăm dòng.

Từ đây, mở rộng nó theo các trục quan trọng: mở rộng tập hợp từ khóa, thay đổi gl theo thị trường, và đẩy các bản snapshot vào một cơ sở dữ liệu để lịch sử tồn tại lâu hơn một tệp đơn. Cách tiếp cận JSON-first tương tự còn mở rộng cho các bề mặt khác được đề cập trong hướng dẫn API Scraper của Scrapeless. Kiểm tra các gói giátài liệu Deep SerpApi để lấy toàn bộ tập hợp tham số, gán một quốc gia cho mỗi từ khóa, đọc vị trí từ trường position, và coi miền vắng mặt là một null thực sự.


Sẵn Sàng Xây Dựng Đường Ống Tìm Kiếm AI của Bạn?

Tham gia cộng đồng của chúng tôi để nhận gói miễn phí và kết nối với các nhà phát triển xây dựng các đường ống theo dõi hạng và tìm kiếm: Discord · Telegram.
Đăng ký tại app.scrapeless.com để nhận tín dụng Deep SerpApi miễn phí và điều chỉnh trình theo dõi phía trên cho bộ từ khóa và các thị trường mà dự án của bạn cần.


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

Q: Theo dõi xếp hạng Google bằng API có hợp pháp không?
Việc truy vấn các kết quả tìm kiếm công khai là cách thức hoạt động của việc theo dõi xếp hạng, và Deep SerpApi trả về cùng kết quả SERP công khai mà một trình duyệt sẽ nhận được — các trang đã được Google thu thập và lập chỉ mục, cùng bộ URL mà chủ sở hữu trang web cung cấp thông qua giao thức Sitemaps. Quy tắc có thể khác nhau tùy thuộc vào quyền tài phán và trường hợp sử dụng, vì vậy hãy xem xét các điều khoản của Google cùng với các chỉ thị thu thập trong Giao thức loại trừ Robots và tham khảo ý kiến luật sư cho ứng dụng cụ thể của bạn.

Q: Điều này khác gì so với một trình theo dõi xếp hạng Google Sheets?
Trình theo dõi bảng tính kiểm tra một ô tại một thời điểm và không lưu trữ lịch sử thực để so sánh. Kịch bản ở đây truy vấn một bộ từ khóa đầy đủ theo cách lập trình, ghi lại các bức ảnh thời gian, và tính toán sự di chuyển giữa các lần chạy, vì vậy nó có thể mở rộng cho các bộ từ khóa lớn và chạy theo lịch trình.

Q: Tôi có cần một proxy để chạy trình theo dõi không?
Không yêu cầu thiết lập proxy riêng. Deep SerpApi định tuyến tìm kiếm qua các địa chỉ egress dân cư ở hơn 195 quốc gia nội bộ, vì vậy kết quả phản ánh SERP của một người dùng thực mà không cần bạn quản lý các địa chỉ IP.

Q: Làm thế nào tôi theo dõi xếp hạng cho một quốc gia cụ thể?
Đặt tham số gl thành mã quốc gia và hl thành ngôn ngữ khi gọi search. Giữ nguyên gl cho một từ khóa nhất định qua các lần chạy để lịch sử vị trí có thể so sánh đồng nhất.

Q: Vị trí null có nghĩa là gì?
Điều đó có nghĩa là miền không có trong các kết quả hữu cơ mà API trả về cho từ khóa đó trong lần chạy đó — hoặc nó xếp hạng dưới bộ đã trả về hoặc nó đã biến mất khỏi trang. Trình theo dõi ghi nhận nó như một sự kiện thực để một sự rơi xuống hiển thị trong các delta.

Q: Trình theo dõi nên chạy bao lâu một lần?
Hàng ngày hoặc hàng tuần thường đáp ứng hầu hết các nhu cầu. Lên lịch bước chụp ảnh và so sánh bằng cron hoặc một công việc CI; vị trí di chuyển theo thời gian của Google, do đó việc polling dưới một ngày hiếm khi thêm tín hiệu.

Q: Tôi có thể khớp các tên miền phụ và đường dẫn với miền của tôi không?
Có. Bộ so khớp rank_of so sánh theo máy chủ và coi một tên miền phụ là một cú đánh, vì vậy blog.yourdomain.comyourdomain.com/page đều được tính là miền của bạn đang xếp hạng.

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