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

使用googlesearch库爬取谷歌URL:代理轮换实现与429错误处理

谷歌搜索爬取遭遇429错误的解决方案与优化方案

你遇到的HTTP Error 429: Too Many Requests是谷歌反爬机制在生效——短时间内发送的请求频率超出了谷歌的限制阈值。下面分步骤帮你解决问题,同时实现代理轮换,再给你推荐更高效的替代方案:

一、基础修复:先缓解429错误

先从最简单的调整入手,不用代理也能大幅降低被限制的概率:

  • 添加请求间隔:googlesearch的search函数支持pause参数,设置每次请求后的等待时间,比如pause=3(秒),给服务器留足缓冲时间;
  • 模拟真实浏览器UA:默认的请求标识容易被识别为爬虫,传入一个真实的浏览器用户代理字符串,让请求更贴近正常用户访问。

修改后的基础版代码:

from googlesearch import search

def get_urls(tag, n, language):
    # 可替换为最新的Chrome浏览器UA字符串
    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"
    urls = [url for url in search(
        tag, 
        stop=n, 
        lang=language,
        pause=3,  # 每次请求间隔3秒
        user_agent=user_agent
    )][:n]
    return urls

google_urls = get_urls('future', 5000, 'it')

二、实现代理轮换:彻底绕过IP限制

如果基础调整还是频繁触发429,就需要通过代理轮换切换IP地址,避免单一IP被封禁。具体步骤如下:

  1. 准备一批可用的HTTP/HTTPS代理(格式:http://ip:port);
  2. 每次搜索前随机挑选一个代理;
  3. 捕获请求异常,遇到代理失效或429时自动切换代理重试。

改造后的带代理轮换的代码:

from googlesearch import search
import random
from urllib.error import HTTPError

# 你的代理池,建议定期更新可用代理(付费代理稳定性远高于免费代理)
PROXY_POOL = [
    "http://123.45.67.89:8080",
    "http://98.76.54.32:3128",
    # 可添加更多代理...
]

def get_urls(tag, n, language):
    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"
    urls = []
    remaining = n
    while remaining > 0:
        # 随机选择一个代理
        proxy = random.choice(PROXY_POOL)
        try:
            # 用当前代理请求剩余数量的URL
            batch_urls = list(search(
                tag,
                stop=remaining,
                lang=language,
                pause=2,
                user_agent=user_agent,
                proxy=proxy
            ))
            urls.extend(batch_urls)
            remaining -= len(batch_urls)
        except HTTPError as e:
            if e.code == 429:
                print(f"代理 {proxy} 触发频率限制,切换代理重试...")
            else:
                print(f"代理 {proxy} 失效,切换代理重试...")
        except Exception as e:
            print(f"请求出错:{str(e)},切换代理重试...")
    # 确保返回的URL数量不超过需求值n
    return urls[:n]

google_urls = get_urls('future', 5000, 'it')

三、更高效的替代方案:彻底避开反爬困扰

如果需要大量、稳定的谷歌搜索结果,谷歌自定义搜索JSON API是最靠谱的选择:

  • 优点:官方接口,不会被反爬限制,返回格式规范,解析成本低;
  • 缺点:免费版每天有100次调用限制,超出需要付费升级。

示例代码(需先在谷歌云平台申请API密钥和自定义搜索引擎ID):

import requests

API_KEY = "你的谷歌API密钥"
SEARCH_ENGINE_ID = "你的自定义搜索引擎ID"

def get_urls_via_api(tag, n, language):
    urls = []
    start = 1
    while len(urls) < n:
        request_url = f"https://www.googleapis.com/customsearch/v1?q={tag}&cx={SEARCH_ENGINE_ID}&key={API_KEY}&lr=lang_{language}&start={start}"
        response = requests.get(request_url)
        data = response.json()
        if "items" not in data:
            break
        for item in data["items"]:
            urls.append(item["link"])
            if len(urls) >= n:
                break
        start += 10  # 官方接口每次最多返回10条结果
    return urls[:n]

google_urls = get_urls_via_api('future', 5000, 'it')

另外,预算有限且对速度要求不高的话,也可以用selenium模拟浏览器操作——它会模拟真实用户的点击、滚动等行为,反爬规避能力更强,但执行效率较低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:20:30