You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需API Key,用Python实现程序化谷歌搜索

无需API Key实现谷歌搜索并获取结果描述

一、是否可以无需API Key做谷歌搜索?

可以,但这种方式属于**网页抓取(爬虫)**范畴,需要遵守谷歌的Robots协议与服务条款,同时要应对反爬机制(比如设置合法的请求头、控制请求频率)。官方的Custom Search JSON API更稳定但需要API Key,爬虫方式适合小量、非商业化的搜索需求。

二、解决“无结果仍返回链接”的问题

你遇到的情况是因为所用Python包的页面解析逻辑未正确识别谷歌的“无结果”状态。可以通过自定义解析逻辑或使用更可靠的工具解决:

手动实现解析(推荐)

用requests+BeautifulSoup直接解析谷歌搜索页面,精准判断无结果状态并提取有效内容:

import requests
from bs4 import BeautifulSoup
import time
import random

def google_search(query):
    # 模拟浏览器请求头,避免被反爬
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    }
    # 对搜索关键词进行URL编码
    encoded_query = requests.utils.quote(query)
    url = f"https://www.google.com/search?q={encoded_query}"
    
    # 添加随机延迟,降低反爬风险
    time.sleep(random.uniform(1, 3))
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")

    # 判断是否无搜索结果
    result_stats = soup.find("div", id="result-stats")
    if result_stats and "0 results" in result_stats.text:
        return []

    # 提取结果标题、链接和描述
    results = []
    for result_card in soup.find_all("div", class_="g"):
        # 提取链接(处理谷歌的跳转链接格式)
        link_tag = result_card.find("a")
        if not link_tag:
            continue
        raw_link = link_tag["href"]
        if raw_link.startswith("/url?q="):
            link = raw_link.split("/url?q=")[1].split("&")[0]
        else:
            link = raw_link
        
        # 提取标题
        title = result_card.find("h3").text if result_card.find("h3") else ""
        
        # 提取谷歌提供的页面描述(snippet)
        desc_tag = result_card.find("span", class_="aCOpRe")
        description = desc_tag.text if desc_tag else ""
        
        results.append({
            "title": title,
            "link": link,
            "description": description
        })
    return results

# 测试示例
print(google_search("不存在的无效关键词123456"))  # 无结果返回空列表
print(google_search("python web scraping"))       # 返回带描述的有效结果

使用第三方库

可以选择维护较及时的googlesearch-python库,它的解析逻辑能正确识别无结果状态:

from googlesearch import search

def search_with_validation(query):
    results = []
    try:
        # 控制返回数量与请求间隔
        for result in search(query, num_results=10, stop=10, pause=2):
            # 如需提取描述,仍需结合BeautifulSoup解析搜索页面
            results.append(result)
    except Exception as e:
        print(f"搜索失败: {str(e)}")
    return results

三、获取链接下方的页面简短描述

谷歌搜索结果里的描述是谷歌预抓取的snippet,直接从搜索结果页面提取即可(如示例中的span.aCOpRe标签),无需额外请求目标页面。如果需要更精准的页面描述,也可以在拿到链接后,请求目标页面并抓取<meta name="description">标签的内容,但会增加请求量,需注意反爬风险。

关键注意事项

  • 必须设置合法的User-Agent,避免被谷歌识别为爬虫封禁IP;
  • 严格控制请求频率,添加随机延迟;
  • 谷歌页面结构可能随时调整,需定期检查并更新解析逻辑。

内容的提问来源于stack exchange,提问作者Marlowe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:06:22