Không cần KYC — không giấy tờ tùy thân, không selfie, không tài liệu. Thanh toán bằng crypto: BTC, USDT, USDC, ETH, SOL, LTC
Ngôn ngữ: Tiếng Việt
Lấy khóa API

Hướng dẫn · Python · code đã kiểm thử · tính đến tháng 10 năm 2026

Cách lấy kết quả tìm kiếm Google bằng Python (2026)

Việc tải google.com bằng requests đã không còn là lựa chọn từ năm 2025. Hướng dẫn này giải thích lý do, sau đó cung cấp Python ngắn gọn, đã kiểm tra cú pháp, nhận cùng kết quả dưới dạng JSON thông qua một SERP API.

Cập nhật lần cuối: · 6 phút đọc

Trả lời nhanh

Làm thế nào để lấy kết quả tìm kiếm Google bằng Python trong năm 2026?

Gọi một SERP API từ Python và đọc JSON trả về; đừng tự tải google.com, vì Google yêu cầu JavaScript từ ngày 17 tháng 1 năm 2025 và robots.txt của nó không cho phép /search. Với SerpCrypto, một requests.get đến https://serpcrypto.com/api/v1/search trả về kết quả organic, People Also Ask và nhiều hơn nữa, với một credit mỗi lượt tìm kiếm từ 0,30 US$/1K lượt tìm kiếm tính đến tháng 10 năm 2026. Không cần KYC; thanh toán bằng crypto.

Những gì bạn cần

Python3.9 trở lên
Các góirequests cho phần cơ bản; pandas cho bảng; httpx cho async
Khóa APITừ dashboard SerpCrypto của bạn, lưu trong biến môi trường SERPCRYPTO_API_KEY
EndpointGET https://serpcrypto.com/api/v1/search
Chi phí1 credit = 1 truy vấn tìm kiếm thành công, trả về một trang kết quả trên bất kỳ engine nào được hỗ trợ. Truy vấn thất bại không bị tính phí
Gói nhỏ nhất10.000 tìm kiếm cho 7,50 US$; credit không bao giờ hết hạn

Vì sao requests.get trên google.com không còn hoạt động nữa?

Vì kết quả không còn nằm trong HTML mà một HTTP client thông thường nhận được. Vào ngày 17 tháng 1 năm 2025, Google bắt đầu yêu cầu JavaScript cho Search; họ cho biết JavaScript giúp bảo vệ dịch vụ khỏi bot và chưa đến 0,1% lượt tìm kiếm đến từ người dùng đã tắt JavaScript, như TechCrunch đưa tin.

robots.txt của Google, đọc ngày 22 tháng 10 năm 2026, cũng liệt kê Disallow: /search cho mọi user agent. Một SERP API lo việc chạy tìm kiếm và phân tích trang, còn code Python của bạn chỉ xử lý JSON. Đó là cách tiếp cận được dùng trong phần còn lại của hướng dẫn này.

Làm thế nào để thực hiện yêu cầu đầu tiên?

Cài requests, đưa khóa của bạn vào một biến môi trường, và gửi truy vấn kèm quốc gia và ngôn ngữ. Phản hồi là một dictionary với một khóa cho mỗi khối của trang kết quả; organic_results chứa các liên kết đã xếp hạng.

Giữ khóa ngoài mã nguồn của bạn. Trên macOS và Linux, export SERPCRYPTO_API_KEY=... trong shell; trên Windows PowerShell, $env:SERPCRYPTO_API_KEY="...".

Yêu cầu đầu tiên với requests
import os

import requests

API = "https://serpcrypto.com/api/v1/search"
KEY = os.environ["SERPCRYPTO_API_KEY"]

resp = requests.get(
    API,
    headers={"Authorization": "Bearer " + KEY},
    params={"engine": "google", "q": "best hiking boots", "gl": "us", "hl": "en"},
    timeout=60,
)
resp.raise_for_status()
results = resp.json()

for item in results.get("organic_results", []):
    print(item["position"], item["title"])
    print("   ", item["link"])

for q in results.get("people_also_ask", []):
    print("PAA:", q["question"])

Làm thế nào để chuyển kết quả thành pandas DataFrame?

Tạo một dòng cho mỗi kết quả organic và giữ truy vấn bên cạnh nó. Một DataFrame giúp dễ dàng sắp xếp, lọc theo tên miền, hoặc xuất ra CSV và Excel. Các trường bị thiếu, như date trên hầu hết kết quả, trở thành ô trống thay vì lỗi.

Nhiều truy vấn vào một DataFrame
import os
from urllib.parse import urlparse

import pandas as pd
import requests

API = "https://serpcrypto.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]}


def organic_rows(query, gl="us", hl="en"):
    params = {"engine": "google", "q": query, "gl": gl, "hl": hl}
    resp = requests.get(API, headers=HEADERS, params=params, timeout=60)
    resp.raise_for_status()
    for r in resp.json().get("organic_results", []):
        yield {
            "query": query,
            "position": r.get("position"),
            "title": r.get("title"),
            "domain": urlparse(r.get("link", "")).netloc,
            "link": r.get("link"),
            "snippet": r.get("snippet"),
        }


queries = ["crm for small business", "invoice software", "time tracking app"]
df = pd.DataFrame([row for q in queries for row in organic_rows(q)])
print(df.groupby("domain").size().sort_values(ascending=False).head(10))
df.to_csv("serp_results.csv", index=False)

Làm thế nào để chạy nhiều truy vấn cùng lúc?

Dùng httpx với asyncio và giới hạn số request đang chạy đồng thời bằng một semaphore. Tài khoản của bạn có giới hạn concurrency, hiển thị trong dashboard; giữ dưới mức đó để tránh lỗi 429. Bắt đầu với một số nhỏ, ví dụ 5, rồi đặt bằng giới hạn mà dashboard hiển thị.

Truy vấn bất đồng bộ với httpx và semaphore
import asyncio
import os

import httpx

API = "https://serpcrypto.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]}
LIMIT = asyncio.Semaphore(5)


async def search(client, query):
    async with LIMIT:
        resp = await client.get(API, params={"engine": "google", "q": query, "gl": "us", "hl": "en"})
        resp.raise_for_status()
        data = resp.json()
        top = data.get("organic_results", [])[:3]
        return query, [r["link"] for r in top]


async def main(queries):
    async with httpx.AsyncClient(headers=HEADERS, timeout=60) as client:
        for query, links in await asyncio.gather(*(search(client, q) for q in queries)):
            print(query, links)


if __name__ == "__main__":
    asyncio.run(main(["python web framework", "python orm", "python task queue"]))

Làm thế nào để lấy hơn 10 kết quả và lưu lại?

Yêu cầu các trang tiếp theo với page=2, page=3, v.v., đến page=10. Mỗi trang là một truy vấn và một credit, vì Google đã trả khoảng 10 kết quả organic mỗi trang kể từ khi ngừng tuân theo num=100 vào tháng 9 năm 2025.

Lưu mỗi response thô thành một dòng của file JSONL. JSON thô giữ mọi block, nên sau này bạn có thể trả lời câu hỏi mới mà không phải trả tiền lại cho cùng các truy vấn đó.

Trang 1 đến 3 được lưu dưới dạng JSONL
import json
import os

import requests

API = "https://serpcrypto.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]}


def fetch_pages(query, pages=3, path="serp.jsonl"):
    with open(path, "a", encoding="utf-8") as out:
        for page in range(1, pages + 1):
            params = {"engine": "google", "q": query, "gl": "us", "hl": "en", "page": page}
            resp = requests.get(API, headers=HEADERS, params=params, timeout=60)
            resp.raise_for_status()
            data = resp.json()
            out.write(json.dumps(data, ensure_ascii=False) + "\n")
            if not data.get("organic_results"):
                break


fetch_pages("electric cargo bike", pages=3)

Chạy đoạn code này tốn bao nhiêu?

Mỗi lần gọi trong các ví dụ này là một truy vấn. Ví dụ đầu tiên tốn một credit, ví dụ DataFrame tốn ba, và ví dụ JSONL tốn tối đa ba. Request thất bại không bị tính phí.

10.000 tìm kiếm tốn 7,50 US$ và 100.000 tìm kiếm tốn 56,25 US$, tính đến tháng 10 năm 2026; mức giá giảm còn 0,30 US$/1K lượt tìm kiếm ở 5.000.000 lượt tìm kiếm. Credit không bao giờ hết hạn. Bạn thanh toán bằng BTC, USDT, USDC, ETH, SOL, LTC từ lần nạp 25 US$, không cần tải ID lên. Xem bảng giá.

Kết quả Google bằng Python: các câu hỏi thường gặp

Tôi có thể dùng BeautifulSoup trên trang kết quả Google không?

Không đáng tin cậy. Google đã yêu cầu JavaScript từ tháng 1 năm 2025, nên HTML mà một client thông thường nhận được không chứa kết quả, và robots.txt của Google chặn /search. Một SERP API trả về các trường đã phân tích dưới dạng JSON.

Có thư viện Python chính thức cho SerpCrypto không?

Không. API là một endpoint HTTPS thông thường, nên bạn chỉ cần requests hoặc httpx. Các ví dụ trên trang này và trên trang tài liệu Python là code copy-paste, không phải package đã phát hành.

Làm thế nào để lấy kết quả cho quốc gia khác?

Đặt gl thành mã quốc gia và hl thành ngôn ngữ, ví dụ gl=fr và hl=fr cho Pháp. Thêm location cho một thành phố. Trang vị trí liệt kê các mã phổ biến.

Làm thế nào để xử lý lỗi và thử lại?

Gọi raise_for_status(), sau đó thử lại các response 429, 502 và 504 sau một khoảng chờ tăng dần. Request thất bại không bị tính phí. Trang lỗi có một hàm thử lại đầy đủ.

Tôi có thể lấy kết quả Bing bằng cùng đoạn code không?

Có. Đổi engine thành bing; response giữ nguyên cấu trúc, với organic_results và related_searches.

Nguồn (3)
  1. Google bắt đầu yêu cầu JavaScript cho Google Search — TechCrunch (2025-01-17)
  2. robots.txt của google.com — Google (read 2026-10-22)
  3. Google buộc các công cụ theo dõi thứ hạng phải dùng 500 đến 1.000 truy vấn cho mỗi từ khóa — PPC Land (2026-08-27)

Từ 0,30 US$/1K lượt tìm kiếm · không cần KYC

Lấy khóa API