使用Python+SerpAPI爬取谷歌地图:如何获取更多结果?
问题与解决方案
核心需求
获取英国完整的桌游咖啡馆列表用于研究,当前代码可正常运行,但设置num: "300"仅返回20条结果。使用SerpAPI免费版,需尽量节省100次免费查询额度,正在申请升级资金。考虑按城镇搜索+5英里半径的方案,希望优化查询效率。
代码疑问:导入问题
为什么仅import serpapi as sp代码无法运行,必须添加from serpapi import GoogleSearch?
- 当你只导入
serpapi包并命名为sp时,GoogleSearch类属于包内的顶层类,需要通过sp.GoogleSearch调用。如果代码中直接写GoogleSearch(params),Python会找不到这个名称,因此必须显式导入GoogleSearch类,或者把代码中的GoogleSearch改为sp.GoogleSearch。
结果数量限制问题:为什么num:300只返回20条?
- SerpAPI的Google Maps引擎单次请求默认返回约20条本地结果,
num参数在此引擎中不生效(或受限于API的分页机制)。Google Maps搜索结果采用分页加载,单次请求只能获取一页数据。 - 免费版SerpAPI额外限制了单次请求的结果上限,即使设置更大的
num值也无法突破。
节省查询次数的优化方案
- 添加半径参数:Google Maps引擎支持
radius参数(单位为米,5英里≈8047米),可缩小搜索范围,避免重复结果。在参数中加入"radius": "8047"。 - 按城镇批量查询:整理英国城镇列表,逐个以
"q": "board game cafe [城镇名]"作为查询词,结合半径参数,每个查询的结果更精准,覆盖范围更全面。 - 分页获取结果:如果某个城镇的结果超过20条,使用
start参数分页(如start=20、start=40),直到返回的local_results为空。优先查询城镇密集区域,减少无效查询。
修正后的代码示例
# 优化导入:二选一即可 import serpapi as sp # 或者 from serpapi import GoogleSearch import csv # 设置基础参数 params = { "engine": "google_maps", "q": "board game cafe stockport", "google_domain": "google.co.uk", "gl": "uk", "radius": "8047", # 5英里≈8047米 "api_key": "你的API密钥" } all_results = [] start = 0 while True: params["start"] = start # 使用sp.GoogleSearch如果只导入serpapi as sp search = sp.GoogleSearch(params) results = search.get_dict() if "local_results" not in results or len(results["local_results"]) == 0: break all_results.extend(results["local_results"]) start += 20 # 每次分页加20,对应每页结果数 # 写入CSV with open('cafes.csv', 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Name', 'Latitude', 'Longitude']) for result in all_results: name = result["title"] lat = result['gps_coordinates']['latitude'] lon = result['gps_coordinates']['longitude'] writer.writerow([name, lat, lon])
内容的提问来源于stack exchange,提问作者Brian Westerman
相关产品推荐
相关产品推荐

