在Python中调用Google PageSpeed API:批量请求返回None
解决Google PageSpeed API批量请求返回None的问题
我之前也碰到过类似的批量请求踩坑情况,咱们一步步来排查解决——既然单独请求能成功,说明你的API密钥、服务构建逻辑都是没问题的,问题大概率出在批量请求的细节处理上。
常见问题点&修复方案
- 回调函数未正确捕获结果:
BatchHttpRequest必须通过回调函数接收每个请求的响应,要是没设置回调或者回调里没存结果,自然拿不到数据。 - 未确保批量请求执行完成:Jupyter Notebook的异步环境有时候会导致批量请求还没跑完就继续往下执行,结果还没生成就被读取了。
下面是修正后的完整代码示例,你可以直接替换测试:
!pip install -U google-api-python-client from apiclient.http import BatchHttpRequest from apiclient.discovery import build # 初始化API服务 google_api_key = "mykey" ps_service = build('pagespeedonline', 'v4', developerKey=google_api_key) # 用来存储批量请求结果的列表 batch_results = [] # 定义回调函数:处理每个请求的响应或异常 def handle_response(request_id, response, exception): if exception: # 捕获请求失败的异常,方便排查 batch_results.append({"request_id": request_id, "error": str(exception)}) else: # 存储成功的响应数据 batch_results.append({"request_id": request_id, "data": response}) # 初始化批量请求对象,绑定回调函数 batch = BatchHttpRequest(callback=handle_response) # 替换成你的实际URL列表 list_of_urls = [ "https://example.com", "https://google.com", "https://github.com" ] # 把每个URL的PageSpeed请求添加到批量对象中 for idx, url in enumerate(list_of_urls): request = ps_service.pagespeedapi().runpagespeed(url=url, strategy="desktop") batch.add(request, request_id=str(idx)) # 给每个请求加唯一ID,方便对应原始URL # 执行批量请求——这一步绝对不能漏! batch.execute() # 查看最终结果 print("批量请求结果:") for result in batch_results: print(result)
关键细节说明
- 回调函数
handle_response:这是批量请求获取结果的核心,必须定义它来接收每个请求的响应或异常,否则结果根本没地方存储。 - 批量请求执行:一定要调用
batch.execute(),而且要确保这行代码执行完成后再去读取batch_results——在Jupyter里尽量把所有步骤放在同一个单元格里执行,避免异步干扰。 - 请求ID设置:给每个请求加唯一的
request_id,方便你把结果和原始URL对应起来,排查问题更高效。
如果还是出现异常,你可以检查下:
- 所有URL是否是可公开访问的HTTP/HTTPS地址
- API密钥的配额是否足够(批量请求会消耗配额,超出配额会返回错误)
内容的提问来源于stack exchange,提问作者mqmitchell
相关产品推荐
相关产品推荐

