# วิธีรับผลการค้นหา Google ใน Python (2026)

> วิธีรับผลการค้นหา Google ใน Python ปี 2026: ทำไม requests ธรรมดาใช้ไม่ได้ แล้วโค้ดที่ทดสอบแล้วสำหรับ requests, pandas, async httpx, การแบ่งหน้า และไฟล์ JSONL

- URL: https://serpcrypto.com/th/guides/google-search-results-python/
- อัปเดตล่าสุด: 2026-10-22
- ผู้เผยแพร่: SerpCrypto (https://serpcrypto.com)

การดึง google.com ด้วย requests หมดทางเลือกไปตั้งแต่ปี 2025 คู่มือนี้อธิบายสาเหตุ แล้วให้โค้ด Python สั้น ๆ ที่ตรวจสอบไวยากรณ์แล้ว ซึ่งได้ผลลัพธ์เดียวกันเป็น JSON ผ่าน SERP API

**คำตอบสั้น — ฉันจะรับผลการค้นหา Google ใน Python ปี 2026 ได้อย่างไร?**

เรียก SERP API จาก Python แล้วอ่าน JSON ที่คืนมา อย่าดึง google.com เอง เพราะ Google กำหนดให้ใช้ JavaScript ตั้งแต่ 17 มกราคม 2025 และ robots.txt ของ Google ห้าม `/search` ด้วย **SerpCrypto** หนึ่ง `requests.get` ถึง `https://serpcrypto.com/api/v1/search` คืนผลลัพธ์ออร์แกนิก, People Also Ask และอื่น ๆ ด้วยเครดิตหนึ่งเครดิตต่อการค้นหา เริ่มต้นที่ US$0.30/1K การค้นหา ณ ตุลาคม 2026 ไม่ต้อง KYC จ่ายด้วยคริปโต

## สิ่งที่คุณต้องมี

| คุณลักษณะ | ค่า |
| --- | --- |
| Python | 3.9 ขึ้นไป |
| แพ็กเกจ | `requests` สำหรับพื้นฐาน; `pandas` สำหรับตาราง; `httpx` สำหรับ async |
| API key | จากแดชบอร์ด SerpCrypto ของคุณ เก็บไว้ใน environment variable `SERPCRYPTO_API_KEY` |
| Endpoint | `GET https://serpcrypto.com/api/v1/search` |
| ค่าใช้จ่าย | 1 เครดิต = 1 คำขอค้นหาที่สำเร็จ ซึ่งคืนผลลัพธ์หนึ่งหน้าบนเอนจินที่รองรับ คำขอที่ล้มเหลวจะไม่ถูกคิดเครดิต |
| แพ็กที่เล็กที่สุด | 10,000 การค้นหา สำหรับ US$7.50; เครดิตไม่มีวันหมดอายุ |

## ทำไม requests.get บน google.com ถึงใช้ไม่ได้อีกต่อไป?

เพราะผลลัพธ์ไม่ได้อยู่ใน HTML ที่ HTTP client ธรรมดาได้รับอีกต่อไป เมื่อวันที่ 17 มกราคม 2025 Google เริ่มกำหนดให้ใช้ JavaScript สำหรับ Search โดยระบุว่า JavaScript ช่วยปกป้องบริการจากบอต และมีการค้นหาน้อยกว่า 0.1% ที่มาจากผู้ใช้ที่ปิด JavaScript ตามที่ TechCrunch รายงาน

robots.txt ของ Google ที่อ่านเมื่อ 22 ตุลาคม 2026 ยังระบุ `Disallow: /search` สำหรับ user agent ทั้งหมดด้วย SERP API จัดการการรันการค้นหาและการแยกวิเคราะห์หน้าเว็บให้ และโค้ด Python ของคุณจัดการเฉพาะ JSON นั่นคือแนวทางที่ใช้ในส่วนที่เหลือของคู่มือนี้

## ฉันจะส่งคำขอแรกได้อย่างไร?

ติดตั้ง requests ใส่คีย์ของคุณใน environment variable แล้วส่งคำค้นหาพร้อมประเทศและภาษา response เป็น dictionary ที่มีหนึ่งคีย์ต่อหนึ่งบล็อกของหน้าผลการค้นหา `organic_results` เก็บลิงก์ที่จัดอันดับแล้ว

เก็บคีย์ไว้นอกซอร์สโค้ดของคุณ บน macOS และ Linux ใช้ `export SERPCRYPTO_API_KEY=...` ในเชลล์; บน Windows PowerShell ใช้ `$env:SERPCRYPTO_API_KEY="..."`

*คำขอแรกด้วย requests*

```python
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"])

```

## ฉันจะแปลงผลลัพธ์เป็น pandas DataFrame ได้อย่างไร?

สร้างหนึ่งแถวต่อหนึ่งผลลัพธ์ออร์แกนิกและเก็บคำค้นหาไว้ข้าง ๆ DataFrame ทำให้จัดเรียง กรองตามโดเมน หรือส่งออกเป็น CSV และ Excel ได้ง่าย ฟิลด์ที่หายไป เช่น `date` ในผลลัพธ์ส่วนใหญ่ จะกลายเป็นเซลล์ว่างแทนที่จะเกิดข้อผิดพลาด

*หลายคำค้นหาใน DataFrame เดียว*

```python
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)

```

## ฉันจะรันการค้นหาหลายรายการพร้อมกันได้อย่างไร?

ใช้ httpx ร่วมกับ asyncio และจำกัดจำนวนคำขอที่ทำงานอยู่พร้อมกันด้วย semaphore บัญชีของคุณมีขีดจำกัดการทำงานพร้อมกัน ซึ่งแสดงอยู่ในแดชบอร์ด การอยู่ใต้ขีดจำกัดนี้ช่วยหลีกเลี่ยงข้อผิดพลาด `429` เริ่มจากจำนวนน้อยๆ เช่น 5 แล้วตั้งให้เท่ากับขีดจำกัดที่แดชบอร์ดแสดง

*การค้นหาแบบ async ด้วย httpx และ semaphore*

```python
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"]))

```

## ฉันจะได้ผลลัพธ์มากกว่า 10 รายการและบันทึกไว้ได้อย่างไร?

ขอหน้าถัดไปด้วย `page=2`, `page=3` และอื่นๆ ไปจนถึง `page=10` แต่ละหน้าเป็นการค้นหาหนึ่งครั้งและใช้หนึ่งเครดิต เพราะ Google แสดงผลลัพธ์แบบ organic ประมาณ 10 รายการต่อหน้า ตั้งแต่เลิกทำตาม `num=100` ในเดือนกันยายน 2025

บันทึก raw response แต่ละรายการเป็นหนึ่งบรรทัดในไฟล์ JSONL ข้อมูล JSON ดิบเก็บทุกบล็อกไว้ จึงตอบคำถามใหม่ในภายหลังได้โดยไม่ต้องจ่ายซ้ำสำหรับการค้นหาเดิม

*หน้า 1 ถึง 3 ที่บันทึกเป็น JSONL*

```python
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)

```

## การรันโค้ดนี้มีค่าใช้จ่ายเท่าไร?

การเรียกแต่ละครั้งในตัวอย่างเหล่านี้คือการค้นหาหนึ่งครั้ง ตัวอย่างแรกใช้หนึ่งเครดิต ตัวอย่าง DataFrame ใช้สาม และตัวอย่าง JSONL ใช้ไม่เกินสาม คำขอที่ล้มเหลวจะไม่ถูกคิดเงิน

10,000 การค้นหา ราคา US$7.50 และ 100,000 การค้นหา ราคา US$56.25 ณ เดือนตุลาคม 2026 อัตราจะลดลงเหลือ US$0.30/1K การค้นหา ที่ 5,000,000 การค้นหา เครดิตไม่มีวันหมดอายุ คุณจ่ายด้วย BTC, USDT, USDC, ETH, SOL, LTC จากการเติมเงิน US$25 โดยไม่ต้องอัปโหลดบัตรประชาชน ดู [ราคา](https://serpcrypto.com/th/pricing/)

## ผลการค้นหา Google ด้วย Python: คำถามที่พบบ่อย

### ฉันใช้ BeautifulSoup กับหน้าผลการค้นหาของ Google ได้ไหม?

ไม่น่าเชื่อถือ Google บังคับใช้ JavaScript ตั้งแต่เดือนมกราคม 2025 ดังนั้น HTML ที่ไคลเอนต์ธรรมดาได้รับจึงไม่มีผลลัพธ์อยู่ และ robots.txt ของ Google ไม่อนุญาต `/search` SERP API จะคืนค่าฟิลด์ที่แยกวิเคราะห์แล้วเป็น JSON แทน

### มีไลบรารี Python อย่างเป็นทางการสำหรับ SerpCrypto ไหม?

ไม่มี API เป็น endpoint แบบ HTTPS ธรรมดา ดังนั้นคุณใช้เพียง `requests` หรือ `httpx` ก็พอ ตัวอย่างในหน้านี้และใน [หน้าเอกสาร Python](https://serpcrypto.com/th/docs/python/) เป็นโค้ดที่คัดลอกไปใช้ได้ ไม่ใช่แพ็กเกจที่เผยแพร่แล้ว

### ฉันจะได้ผลลัพธ์สำหรับประเทศอื่นได้อย่างไร?

ตั้ง `gl` เป็นรหัสประเทศ และ `hl` เป็นภาษา ตัวอย่างเช่น `gl=fr` และ `hl=fr` สำหรับฝรั่งเศส เพิ่ม `location` สำหรับเมือง [หน้า locations](https://serpcrypto.com/th/docs/locations/) แสดงรหัสที่ใช้บ่อย

### ฉันจะจัดการกับข้อผิดพลาดและการลองใหม่ได้อย่างไร?

เรียก `raise_for_status()` แล้วลองใหม่เมื่อได้รับการตอบกลับ `429`, `502` และ `504` หลังจากหน่วงเวลาที่เพิ่มขึ้น คำขอที่ล้มเหลวจะไม่ถูกคิดเงิน [หน้า errors](https://serpcrypto.com/th/docs/errors/) มีฟังก์ชันลองใหม่แบบครบถ้วน

### ฉันจะได้ผลลัพธ์จาก Bing ด้วยโค้ดเดียวกันได้ไหม?

ได้ เปลี่ยน `engine` เป็น `bing` รูปแบบการตอบกลับยังคงเหมือนเดิม ด้วย `organic_results` และ `related_searches`

## แหล่งที่มา

1. [Google เริ่มกำหนดให้ใช้ JavaScript สำหรับ Google Search](https://techcrunch.com/2025/01/17/google-begins-requiring-javascript-for-google-search/) — TechCrunch (2025-01-17)
2. [robots.txt ของ google.com](https://www.google.com/robots.txt) — Google (read 2026-10-22)
3. [Google บังคับให้ตัวติดตามอันดับต้องใช้ 500 ถึง 1,000 คำขอต่อหนึ่งคำค้นหา](https://ppc.land/google-forces-rank-trackers-into-500-to-1-000-requests-per-query/) — PPC Land (2026-08-27)

---

SerpCrypto: SerpCrypto คือ SERP API สำหรับนักพัฒนาและ AI agent ที่ส่งคืนผลการค้นหา Google และ Bing เป็น JSON จ่ายด้วยคริปโตโดยไม่ต้องอัปโหลดบัตรประชาชน เครดิตการค้นหาแบบเติมเงินจาก US$0.30/1K การค้นหา ไม่มีวันหมดอายุ ไม่ต้อง KYC — ไม่ต้องใช้บัตรประชาชน ไม่ต้องเซลฟี่ ไม่ต้องใช้เอกสาร จ่ายด้วยคริปโต
