Quay lại blog

Xây dựng Tập dữ liệu Ảnh chụp SERP Google cho Nghiên cứu SEO

Michael Lee
Michael Lee

Expert Network Defense Engineer

11-Sep-2026

TL;DR:

  • Theo dõi SERP Google cần một bản ghi của tìm kiếm, không chỉ là một cột xếp hạng. Lưu trữ yêu cầu chính xác, thời gian của khách hàng, trạng thái xử lý và phản hồi thô cùng nhau.
  • Xây dựng lịch sử từ các quan sát của riêng bạn. Một yêu cầu tìm kiếm hiện tại không điền vào những ngày trước khi bắt đầu thu thập.
  • So sánh các kết quả hữu cơ trong một ngữ cảnh cố định. Thay đổi trong truy vấn, quốc gia, ngôn ngữ hoặc độ sâu thu thập tạo ra một nhóm so sánh khác nhau.

Một giá trị xếp hạng mất ý nghĩa khi bảng tính không còn ghi lại tìm kiếm nào đã tạo ra nó. Cùng một trang có thể xuất hiện dưới các truy vấn khác nhau, ở các thị trường khác nhau và bên cạnh các mô-đun kết quả khác nhau. Một tập dữ liệu hữu ích giữ các điều kiện đó gắn liền với mỗi quan sát.

Theo dõi SERP Google bắt đầu với thu thập lặp lại và một định nghĩa rõ ràng về những gì được coi là kết quả có thể so sánh. Scrapeless Google Search API cung cấp dữ liệu tìm kiếm có cấu trúc; ứng dụng cung cấp chính sách lưu trữ và lịch sử. Bài viết này xây dựng ranh giới đó một cách rõ ràng, từ một tệp capture đến một tập dữ liệu mà nhà phân tích khác có thể kiểm tra.

Định nghĩa quan sát trước lịch trình

Một snapshot là kết quả đã lưu của một yêu cầu tìm kiếm được cấu hình. Nó bao gồm đầu vào đã gửi và phản hồi nhận được từ phía khách hàng. Nó không thiết lập mọi thứ mà mỗi người dùng đã thấy cho truy vấn đó.

Ghi lại phạm vi của tập dữ liệu trước khi lập lịch thu thập. Chọn một danh sách truy vấn, ngữ cảnh thị trường, ngôn ngữ, loại kết quả và chính sách phân trang. Gán mỗi truy vấn cho một chủ đề nghiên cứu để một báo cáo sau này có thể giải thích lý do tại sao truy vấn được đưa vào. Một mẫu nhỏ đã được xem xét dễ giải thích hơn một tập hợp lớn mà ý định của nó thay đổi mỗi tuần.

Tách lịch thu thập ra khỏi ngữ cảnh tìm kiếm. Ngữ cảnh xác định những quan sát nào có thể được so sánh; dấu thời gian xác định khi ứng dụng đã yêu cầu và nhận chúng. Dấu thời gian nhận của khách hàng không phải là một tuyên bố về thời điểm chính xác mà Google đã tạo ra trang.

Giữ các bản ghi thô và các hàng kết quả được suy diễn

Bản ghi thô nên giữ lại yêu cầu, phản hồi và trạng thái thu thập. Một hàng kết quả được suy diễn nên chỉ lại bản ghi đó thông qua một định danh chạy ổn định.

Giữ các trường như position, title, link, và snippet trong dự đoán kết quả hữu cơ khi có sẵn. Cũng giữ chỉ số mảng như một trường riêng biệt nếu bạn cần bảo tồn thứ tự nguồn. Một vị trí trở về bị thiếu phải giữ nguyên là bị thiếu; một chỉ số mảng không nên im lặng thay thế nó.

Mô hình dữ liệu JSON cung cấp các mảng, đối tượng và null những ý nghĩa khác nhau. Bảo tồn những điểm khác biệt đó trong lưu trữ ngay cả khi lớp báo cáo sau này sử dụng một bảng đơn giản hơn. Phản hồi thô làm cho việc thay đổi một ánh xạ mà không thu thập lại một quan sát không thể được tái hiện thành công.

Lưu trữ phiên bản trình phân tích cùng với dữ liệu được suy diễn. Khi một trình phân tích được chỉnh sửa, tái tạo dự đoán bị ảnh hưởng và đánh dấu phiên bản mới. Xem một bản cập nhật trình phân tích như một thay đổi thị trường sẽ tạo ra một xu hướng sai.

Điều kiện tiên quyết cho một tệp capture

Sử dụng Python với gói requests được cài đặt và một khóa API Scrapeless được cung cấp qua SCRAPELESS_API_KEY. Cài đặt khách hàng với python3 -m pip install requests. Các nhập khẩu còn lại sử dụng thư viện tiêu chuẩn.

Lưu script dưới đây thành capture_snapshot.py và chạy python3 capture_snapshot.py. Nó ghi một tệp JSON có tên duy nhất dưới snapshots. Đảm bảo rằng thư mục đó có thể ghi và được bao gồm trong chính sách lưu trữ của bạn. Ví dụ này là một chương trình capture cục bộ; nó không cung cấp một trình lập lịch, cơ sở dữ liệu hoặc dịch vụ truy xuất kết quả tác vụ.

Một lần chạy đã xác thực yêu cầu khóa tài khoản của riêng bạn. Không có kết quả tài khoản trực tiếp nào được tuyên bố ở đây. Giao diện yêu cầu đã được kiểm tra theo quy trình yêu cầu tìm kiếm Google hiện tại; tệp xung quanh và xử lý trạng thái có thể được kiểm tra cục bộ.

Ghi lại yêu cầu và trạng thái xử lý của nó

Chương trình capture gửi actor: scraper.google.search với các cài đặt tìm kiếm bên trong input. Xác thực sử dụng tiêu đề x-api-token.

Lưu ý: Khối này yêu cầu SCRAPELESS_API_KEY và quyền truy cập dịch vụ. Nó chưa được thực hiện chống lại một tài khoản trực tiếp cho bài viết này. Các phản hồi tác vụ đang chờ được lưu lại để kiểm tra; truy xuất kết quả tác vụ nằm ngoài ví dụ này.

python Copy
import json
import os
import uuid
from datetime import datetime, timezone
from pathlib import Path
import requests

def capture(input_parameters, directory="snapshots"):
    key = os.environ["SCRAPELESS_API_KEY"]
    request = {"actor": "scraper.google.search", "input": input_parameters}
    record = {
        "schema_version": 1,
        "run_id": str(uuid.uuid4()),
        "requested_at": datetime.now(timezone.utc).isoformat(),
        "request": request,
    }
    try:
        response = requests.post(
            "https://api.scrapeless.com/api/v1/scraper/request",
            headers={"x-api-token": key}, json=request, timeout=120,
        )
        record["http_status"] = response.status_code
        record["received_at"] = datetime.now(timezone.utc).isoformat()
        try:
            payload = response.json()
        except ValueError:
            payload = None
            record["response_text"] = response.text
        record["response"] = payload
        organic = payload.get("organic_results") if isinstance(payload, dict) else None
        if response.status_code == 201:
            record["state"] = "pending"
        elif response.status_code != 200:
            record["state"] = "http_error"
        elif not isinstance(organic, list) or any(not isinstance(x, dict) for x in organic):
            record["state"] = "unmapped"
        else:
            record["state"] = "observed" if organic else "empty"
    except requests.RequestException as exc:
        record["state"] = "transport_error"
        record["error_type"] = type(exc).__name__
    root = Path(directory)
    root.mkdir(parents=True, exist_ok=True)
    path = root / (record["run_id"] + ".json")
    with path.open("x", encoding="utf-8") as handle:
        json.dump(record, handle, ensure_ascii=False, indent=2)
    print(path, record["state"])
    return path

if __name__ == "__main__":
    capture({"q": "coffee", "gl": "us", "hl": "en", "start": 0,
             "google_domain": "google.com", "device": "desktop"})

Kịch bản ghi lại hồ sơ sau thao tác HTTP, bao gồm các kết quả lỗi hữu ích cho việc bao phủ thu thập. Hồ sơ ngoại lệ của nó chứa loại ngoại lệ thay vì một chuỗi chẩn đoán đầy đủ có thể phơi bày các chi tiết yêu cầu không cần thiết. Lưu trữ các khóa tách biệt khỏi dữ liệu tìm kiếm đã lưu trữ.

Thời gian chờ 120 là một lựa chọn ứng dụng. Nó không phải là một đảm bảo thời gian phản hồi dịch vụ. Các đánh dấu thời gian nhận thức múi giờ của Python làm cho thời gian khách hàng trở nên rõ ràng; sử dụng cùng một quy ước khi một bộ thu thập khác ghi vào tập dữ liệu.

Bắt đầu thu thập với Scrapeless

Tăng cường quy trình thu thập dữ liệu và tự động hóa của bạn với Scrapeless!
Đăng ký hôm nay và nhận 5 đô la tín dụng miễn phíkhông yêu cầu thẻ tín dụng.

Đòi hỏi tín dụng miễn phí của bạn ngay bây giờ trong Bảng điều khiển Scrapeless.

Đối xử với bộ sưu tập thiếu hụt như một kết quả riêng

Một quan sát thất bại không có nghĩa là một miền theo dõi đã biến mất. Trường trạng thái bảo vệ báo cáo khỏi sai lầm đó.

observed có nghĩa là một phản hồi dữ liệu thành công chứa một mảng đối tượng hữu cơ không rỗng. empty có nghĩa là mảng đã có mặt và rỗng. unmapped có nghĩa là phản hồi thành công không phù hợp với hình dạng tối thiểu đó. Đây là các nhãn ứng dụng, không phải mã trạng thái API bổ sung.

pending ghi lại trạng thái tác vụ HTTP 201 đã được tài liệu. Giữ lại định danh tác vụ được trả về với phản hồi thô và sử dụng quy trình thu thập kết quả đã được xác minh riêng trước khi tính toán rằng lần chạy đó đã được quan sát. Các lỗi HTTP và lỗi vận chuyển thuộc về báo cáo thu thập, không phải trong biểu đồ chuyển động xếp hạng.

Khi chuẩn bị chế độ xem hàng tuần, hãy cho biết có bao nhiêu quan sát dự kiến có thể sử dụng. Giữ một danh sách các lần chạy bị thiếu hoặc chưa giải quyết bên cạnh sự so sánh kết quả. Một biểu đồ lặng lẽ loại trừ thu thập thất bại có thể trông ổn định trong khi chứng cứ của nó trở nên mỏng hơn.

So sánh kết quả hữu cơ giống nhau

Một khóa so sánh nên bao gồm mọi cài đặt tìm kiếm đã gửi có thể ảnh hưởng đến quan sát. Cách thực hiện bảo thủ đơn giản nhất tuần tự hóa toàn bộ đối tượng yêu cầu với các khóa đã được sắp xếp, chỉ loại bỏ các đánh dấu thời gian ứng dụng và định danh lần chạy.

Các tuỳ chọn tuần tự hóa JSON xác định của Python hỗ trợ các khóa từ điển đã được sắp xếp. Điều này cung cấp cho ứng dụng của bạn một đại diện lặp lại của các cài đặt đã gửi. Nó không chứng minh rằng các cài đặt khác nhau là tương đương ngữ nghĩa, và nó không làm đóng băng hành vi tìm kiếm upstream.

Giữ start trong khóa khi so sánh các lát trang. Nếu báo cáo kết hợp nhiều trang thành một cửa sổ thu thập, hãy định nghĩa cửa sổ cấp cao hơn đó riêng biệt và đánh dấu các trang bị thiếu. Không trộn lẫn quan sát trang đầu tiên với một bộ sưu tập sâu hơn và gọi sự khác biệt đó là lợi ích xếp hạng.

Chỉ sử dụng các vị trí hữu cơ đã trả về trong khuôn khổ diễn giải được hỗ trợ bởi phản hồi thu thập của bạn. Giữ các mô-đun hình ảnh, địa phương và các mô-đun khác tách biệt. Các quy tắc đo lường vị trí của Search Console mô tả một hệ thống báo cáo khác; một vị trí API được lấy mẫu không nên được gán nhãn lại là vị trí trung bình của Search Console.

Xây dựng nhật ký thay đổi có thể xem xét

Một hồ sơ thay đổi hữu ích xác định lần chạy cũ, lần chạy mới, ngữ cảnh, URL bị ảnh hưởng và quy tắc đã phát hiện thay đổi. Nó nên mô tả một quan sát trước khi gợi ý một nguyên nhân.

Đối với một miền, phân biệt "có mặt trong cả hai lát đã được ghi lại", "được quan sát mới trong lát này" và "không được quan sát trong lát sau". Nhãn cuối cùng hẹp hơn "bị loại bỏ khỏi Google." Miền có thể nằm ngoài độ sâu thu thập được, và việc thay thế URL có thể giữ nguyên sự hiện diện của miền.

Đối với một URL, giữ lại cả so sánh liên kết chính xác và máy chủ đã chuẩn hóa. Việc chuẩn hóa có thể giúp nhóm các trang, nhưng loại bỏ các đường dẫn, tham số hoặc tên miền phụ cũng có thể kết hợp những điều mà nghiên cứu quan tâm. Tài liệu mỗi quy tắc chuẩn hóa và giữ liên kết ban đầu bên cạnh giá trị đã được suy diễn.

Chuyển đổi các thay đổi đến việc xem xét của con người với chứng cứ đã lưu lại. Cập nhật trang, ngữ cảnh truy vấn và các thay đổi tìm kiếm rộng hơn đều xứng đáng được điều tra. Một đôi ảnh chụp đơn giản không thể xác định cái nào đã gây ra chuyển động.

Kết luận

Bắt đầu tập dữ liệu với một phạm vi rõ ràng và một hồ sơ chụp thô. Thêm các hàng hữu cơ suy ra chỉ sau khi trạng thái chạy được hiểu, sau đó so sánh các hồ sơ mà cài đặt yêu cầu khớp. Kết quả là một lịch sử mà nhóm của bạn có thể kiểm toán, với các khoảng trống thu thập được hiển thị thay vì bị chuyển đổi thành các tuyên bố xếp hạng.
Một hướng dẫn thu thập tìm kiếm Python cung cấp thông tin nền bổ sung; hãy sử dụng giao diện yêu cầu hiện tại được hiển thị ở đây cho bộ dữ liệu này.

Xây Dựng Quan Sát Tìm Kiếm Tiếp Theo Của Bạn

Cấu hình Google Search API xung quanh các câu hỏi mà nhóm của bạn cần trả lời. Kiểm tra giá cả của Scrapeless trước khi thiết lập tần suất thu thập. Mô hình tham số Google Search giải thích các điều khiển ngữ cảnh được sử dụng trong quy trình làm việc này.

Thảo luận về triển khai của bạn với cộng đồng trên Discord hoặc Telegram.

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

Q: Điều này có lấy được thứ hạng Google lịch sử trước khi việc thu thập bắt đầu không?

Không. Quy trình làm việc này xây dựng lịch sử từ các quan sát mà bạn lưu lại. Nó không tạo ra các bản chụp trước đó hoặc cung cấp cơ sở dữ liệu xếp hạng lịch sử.

Q: Một mảng hữu cơ rỗng có giống với yêu cầu thất bại không?

Không. Một mảng rỗng hiện tại được ghi nhận là empty; các lỗi HTTP, lỗi vận chuyển, tác vụ đang chờ xử lý, và phản hồi không được ánh xạ có các trạng thái riêng biệt.

Q: Liệu các quốc gia khác nhau có thể chia sẻ cùng một lịch sử xếp hạng không?

Chúng có thể chia sẻ một hệ thống lưu trữ, nhưng nên giữ riêng các nhóm so sánh. Quốc gia là một phần của ngữ cảnh yêu cầu.

Q: Liệu vị trí kết quả có đo lường lượt truy cập hay doanh thu không?

Không. Nó mô tả quan sát tìm kiếm được trả về. Lưu lượng truy cập và kết quả kinh doanh cần bằng chứng và định nghĩa phù hợp riêng.

Q: Tần suất nào nên thu thập các bản chụp?

Chọn một nhịp điệu phù hợp với câu hỏi nghiên cứu, ngân sách, và khả năng xem xét. Ghi lại các quan sát đã bị bỏ lỡ và tránh ngụ ý rằng một lịch trình lấy mẫu thu thập cada thay đổi nào.

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