使用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被封禁。具体步骤如下:
- 准备一批可用的HTTP/HTTPS代理(格式:
http://ip:port); - 每次搜索前随机挑选一个代理;
- 捕获请求异常,遇到代理失效或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
相关产品推荐
相关产品推荐

