三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

北京通州网站建设网站备案是域名备案还是主机备案

北京通州网站建设网站备案是域名备案还是主机备案 北京通州网站建设,网站备案是域名备案还是主机备案,asp网站js悬浮窗怎么做,乌海做网站的公司在开发大语言模型应用、RAG 系统或者 Agent 时,经常需要让程序获取互联网中的最新信息。 一种直接的方法是自己编写爬虫抓取搜索引擎页面,但这种方式需要处理页面结构变化、反爬虫、验证码、代理和结果解析等问题。 … 在开发大语言模型应用、RAG 系统或者 Agent 时,经常需要让程序获取互联网中的最新信息。 一种直接的方法是自己编写爬虫抓取搜索引擎页面,但这种方式需要处理页面结构变化、反爬虫、验证码、代理和结果解析等问题。 SerpApi 将这些过程封装成了搜索 API。开发者只需要传入搜索关键词和相关参数,就可以获得结构化的搜索结果。 本文介绍 SerpApi 的基本概念、安装与配置方法,并实现一个简单的 Google 网页搜索工具。一、SerpApi 是什么 SERP 是 Search Engine Results Page 的缩写,即“搜索引擎结果页面”。 SerpApi 是一个第三方搜索结果 API 服务。它可以调用 Google、Bing、百度、Google Scholar、Google News、Google Maps、YouTube 等搜索服务,并将搜索页面解析为结构化 JSON 数据。 例如,在 Google 中搜索: 什么是人工智能 Agent普通用户看到的是一个网页,而程序通过 SerpApi 可以获得类似下面的结构化结果: {"answer_box": {"snippet": "AI Agent 是一种能够自主完成任务的人工智能系统……"},"knowledge_graph": {"title": "AI Agent","description": "……"},"organic_results": [{"position": 1,"title": "网页标题","link": "网页地址","snippet": "网页摘要"}] }程序可以直接读取: results.get("answer_box") results.get("knowledge_graph") results.get("organic_results")不需要再对 HTML 网页进行手动解析。 SerpApi 比较适合以下场景:为 AI Agent 添加网页搜索工具; 为 RAG 系统补充互联网信息; 获取新闻、图片、论文和普通网页结果; 进行搜索结果分析; 获取特定地区、语言或设备下的搜索结果; 进行 SEO、竞品分析和信息监控。需要注意,SerpApi 是第三方服务,不是 Google 官方提供的 Python SDK。调用 SerpApi 需要注册账号并获取 API Key,同时搜索请求会消耗账户额度。二、安装 SerpApi 1. 安装新版 Python 包 执行: python -m pip install -U serpapi本文还会使用 .env 文件管理 API Key,因此同时安装 python-dotenv: python -m pip install -U serpapi python-dotenv也可以一次安装: python -m pip install -U serpapi python-dotenv2. 新旧版本接口区别 网上很多较早的教程使用: from serpapi import SerpApiClient或者: from serpapi import GoogleSearch这些通常对应旧版 google-search-results 包。 新版官方包的安装名称是: pip install serpapi新版推荐写法是: import serpapiclient = serpapi.Client(api_key="你的API_KEY" )因此,如果出现下面的错误: ImportError: cannot import name 'SerpApiClient' from 'serpapi'通常说明当前安装的是新版 serpapi,但代码使用了旧版接口。 本文统一使用新版写法: import serpapi以及: serpapi.Client(...)三、配置 SerpApi 1. 获取 API Key 注册 SerpApi 账号后,可以在账户页面获取自己的 API Key。 API Key 属于敏感信息,不建议直接写入 Python 源码,例如不要这样写: api_key = "xxxxxxxxxxxxxxxx"更推荐将 API Key 保存到 .env 文件中。 2. 创建 .env 文件 在项目根目录创建 .env 文件: SERPAPI_API_KEY=你的SerpApi密钥例如项目结构为: hello-agents/ ├── .env ├── .gitignore └── search.py3. 配置 .gitignore 为了避免将 API Key 上传到 GitHub,在 .gitignore 文件中加入: .env __pycache__/ *.pyc4. 在 Python 中读取 API Key 首先加载 .env: from dotenv import load_dotenvload_dotenv()然后通过 os.getenv() 读取环境变量: import osapi_key = os.getenv("SERPAPI_API_KEY")如果 .env 文件中配置了: SERPAPI_API_KEY=abc123那么: api_key = os.getenv("SERPAPI_API_KEY")读取到的就是字符串: abc123四、完整例程 下面实现一个简单的网页搜索函数。 程序会按照以下顺序解析搜索结果:优先返回 answer_box 中的直接答案; 如果没有直接答案,则返回 knowledge_graph 中的知识图谱描述; 如果仍然没有,则返回前三条 organic_results 普通网页结果。import osimport serpapi from dotenv import load_dotenv# 加载项目根目录下 .env 文件中的环境变量 load_dotenv()def search(query: str) - str:"""使用 SerpApi 调用 Google 搜索。结果解析顺序:1. Answer Box 直接答案;2. Knowledge Graph 知识图谱;3. 前三条普通网页搜索结果。"""print(f"🔍 正在执行 [SerpApi] 网页搜索:{query}")# 从环境变量中读取 SerpApi API Keyapi_key = os.getenv("SERPAPI_API_KEY")# 如果没有读取到 API Key,则直接返回错误信息if not api_key:return "错误:SERPAPI_API_KEY 未在 .env 文件中配置。"try:# 创建新版 SerpApi 客户端client = serpapi.Client(api_key=api_key,timeout=20,)# 设置 Google 搜索参数params = {"engine": "google","q": query,"gl": "cn","hl": "zh-cn",}# 发起搜索请求results = client.search(params)# ==================================================# 1. 优先读取 Answer Box# ==================================================answer_box = results.get("answer_box", {})if answer_box:# 不同类型的直接答案可能存放在不同字段中for field in ("answer","result","snippet","definition",):value = answer_box.get(field)if value:return str(value)# 某些直接答案会以列表形式返回answer_list = answer_box.get("list")if isinstance(answer_list, list):return "\n".join(str(item)for item in answer_list)# ==================================================# 2. 读取 Knowledge Graph# ==================================================knowledge_graph = results.get("knowledge_graph",{},)if knowledge_graph:title = knowledge_graph.get("title", "")description = knowledge_graph.get("description","",)if description:if title:return f"{title}\n{description}"return description# ==================================================# 3. 读取普通网页搜索结果# ==================================================organic_results = results.get("organic_results",[],)if organic_results:snippets = []# 最多返回前三条普通网页结果for index, result in enumerate(organic_results[:3],start=1,):title = result.get("title","无标题",)snippet = result.get("snippet","无摘要",)link = result.get("link","",)text = (f"[{index}] {title}\n"f"{snippet}")if link:text += f"\n链接:{link}"snippets.append(text)return "\n\n".join(snippets)# 请求成功,但没有找到可用结果return f"对不起,没有找到关于“{query}”的信息。"except serpapi.TimeoutError:return "搜索时发生错误:SerpApi 请求超时。"except serpapi.HTTPError as error:return f"搜索时发生 HTTP 错误:{error}"except Exception as error:return f"搜索时发生错误:{error}"if __name__ == "__main__":result = search("什么是人工智能 Agent")print("\n搜索结果:")print(result)五、分块详解 1. 加载 .env 文件 load_dotenv()load_dotenv() 会查找项目中的 .env 文件,并将其中的配置加载到当前 Python 进程的环境变量中。 之后便可以使用: os.getenv("SERPAPI_API_KEY")获取 API Key。 如果环境变量不存在,os.getenv() 默认返回 None: api_key = os.getenv("SERPAPI_API_KEY")if not api_key:return "错误:SERPAPI_API_KEY 未在 .env 文件中配置。"这里的 not api_key 可以同时判断:api_key 是 None; api_key 是空字符串; API Key 没有正确配置。2. 创建 SerpApi 客户端 client = serpapi.Client(api_key=api_key,timeout=20, )这里使用的是新版 serpapi 包中的 Client。 api_key 用于验证 SerpApi 账户身份: api_key=api_keytimeout 设置网络请求的超时时间: timeout=20表示请求超过 20 秒仍未完成时,抛出超时异常。 客户端创建完成后,可以多次调用: client.search(...)因此,在包含大量搜索操作的项目中,也可以将 client 创建为一个长期复用的对象,而不是每次搜索都重新创建。3. 设置搜索参数 例程中使用的参数为: params = {"engine": "google","q": query,"gl": "cn","hl": "zh-cn", }engine 指定搜索引擎: "engine": "google"常见值包括: "google" "google_scholar" "google_news" "google_images" "google_maps" "bing" "baidu" "youtube"不同搜索引擎支持的参数和返回字段可能不同。 例如 Google Scholar: params = {"engine": "google_scholar","q": "low-light image enhancement", }百度: params = {"engine": "baidu","q": "低照度图像增强", }q 设置搜索关键词: "q": query它可以是普通关键词: "q": "人工智能 Agent"也可以使用 Google 搜索表达式: "q": '"artificial intelligence agent"'限制网站: "q": "image restoration site:openaccess.thecvf.com"限制标题: "q": 'intitle:"low-light image enhancement"'排除关键词: "q": "Python 教程 -广告"gl 设置 Google 搜索使用的国家或地区: "gl": "cn"常见值包括: cn:China us:United States uk:United Kingdom jp:Japangl 会影响搜索结果的地区倾向和排序。 hl 设置 Google 搜索使用的语言: "hl": "zh-cn"常见值包括: zh-cn:简体中文 en:英文 ja:日文 fr:法文需要注意,hl 主要影响 Google 搜索界面和结果呈现语言,并不意味着结果网页一定全部使用该语言。4. 其他常用搜索参数 虽然完整例程中没有使用下面这些参数,但在实际项目中也比较常见。 location 指定搜索发起位置: params = {"engine": "google","q": "附近的咖啡店","location": "Beijing, China","gl": "cn", }它适合本地商家、招聘、地图、新闻和地区相关搜索。 通常建议将 location 设置到城市级别,并与对应的 gl 一起使用。 device 模拟不同设备执行搜索: "device": "desktop"常见值: desktop tablet mobile不同设备可能得到不同的搜索页面布局和结果排序。 start 设置搜索结果偏移量,主要用于分页: "start": 0例如: start=0:第一页 start=10:第二页 start=20:第三页分页搜索示例: for start in range(0, 30, 10):results = client.search({"engine": "google","q": "人工智能 Agent","start": start,})每次调用 client.search() 都会产生一次新的搜索请求。 safe 控制成人内容过滤: "safe": "active"常见值: active:启用过滤 off:关闭过滤tbm 切换 Google 搜索类型: "tbm": "nws"常见值包括: isch:图片搜索 lcl:本地搜索 vid:视频搜索 nws:新闻搜索 shop:购物搜索 pts:专利搜索例如搜索新闻: params = {"engine": "google","q": "人工智能 Agent","tbm": "nws", }也可以直接使用独立引擎: params = {"engine": "google_news","q": "人工智能 Agent", }tbs 设置 Google 高级过滤条件,常用于时间过滤: "tbs": "qdr:m"常见时间范围: qdr:h:最近一小时 qdr:d:最近一天 qdr:w:最近一周 qdr:m:最近一个月 qdr:y:最近一年例如搜索最近一个月的 Agent 信息: params = {"engine": "google","q": "AI Agent","tbs": "qdr:m", }no_cache 强制获取新的搜索结果: "no_cache": True默认情况下,SerpApi 可能返回完全相同请求的缓存结果。 需要尽量获取最新结果时,可以设置: "no_cache": True不过这会重新执行搜索,并消耗搜索额度。 output 设置响应格式: "output": "json"常见值: json:返回结构化 JSON,默认值 html:返回原始 HTML通常使用默认的 JSON 即可。 HTML 主要用于调试,或者查看尚未被 SerpApi 解析成结构化字段的页面内容。 async 以异步方式提交搜索任务: "async": True异步搜索会先提交任务并返回搜索 ID,之后需要通过 Search Archive API 获取最终结果。 普通 Agent 工具通常直接使用同步搜索即可,因此本文例程没有启用异步模式。5. 发起搜索请求 results = client.search(params)client.search() 会将参数发送给 SerpApi,并返回搜索结果。 新版 SDK 返回的是 SerpResults 对象。 它可以像普通 Python 字典一样使用: results.get("answer_box", {}) results.get("knowledge_graph", {}) results.get("organic_results", [])也可以直接打印完整结果: print(results)调试时还可以查看所有顶层字段: print(results.keys())6. 为什么使用 get() 下面的写法直接通过键获取值: answer_box = results["answer_box"]如果当前搜索结果中没有 answer_box,程序会抛出: KeyError: 'answer_box'更安全的写法是: answer_box = results.get("answer_box", {})如果字段存在,则返回对应值。 如果字段不存在,则返回指定的默认值 {}。 列表字段通常使用空列表作为默认值: organic_results = results.get("organic_results",[], )因为不同搜索请求返回的字段并不固定,所以解析 SerpApi 结果时通常应优先使用 .get()。7. 解析 answer_box answer_box = results.get("answer_box", {})answer_box 表示 Google 搜索页面中的直接答案。 不同类型的搜索,直接答案可能存放在不同字段中,例如: answer_box.get("answer") answer_box.get("result") answer_box.get("snippet") answer_box.get("definition") answer_box.get("list")因此代码按照顺序检查: for field in ("answer","result","snippet","definition", ):value = answer_box.get(field)if value:return str(value)只要找到第一个有效字段,就直接返回结果。 例如,某次搜索可能返回: {"answer_box": {"type": "organic_result","snippet": "AI Agent 是一种能够自主执行任务的系统……"} }此时代码会读取: answer_box.get("snippet")并返回对应文本。8. 解析 knowledge_graph knowledge_graph = results.get("knowledge_graph",{}, )知识图谱通常用于描述某个明确实体,例如:人物; 公司; 学校; 城市; 技术; 产品; 组织。常见字段包括: knowledge_graph.get("title") knowledge_graph.get("description") knowledge_graph.get("source") knowledge_graph.get("website") knowledge_graph.get("thumbnail")本文只读取: title = knowledge_graph.get("title", "") description = knowledge_graph.get("description","", )然后将标题和描述拼接起来: return f"{title}\n{description}"9. 解析 organic_results organic_results = results.get("organic_results",[], )organic_results 表示普通的自然搜索结果。 它通常是一个列表: [{"position": 1,"title": "网页标题","link": "网页链接","snippet": "网页摘要"},{"position": 2,"title": "网页标题","link": "网页链接","snippet": "网页摘要"} ]例程只取前三条: organic_results[:3]然后通过 enumerate() 同时获得结果编号和结果内容: for index, result in enumerate(organic_results[:3],start=1, ):其中: start=1表示编号从 1 开始,而不是从 0 开始。 单条普通搜索结果中比较常见的字段包括: result.get("position") result.get("title") result.get("link") result.get("displayed_link") result.get("snippet") result.get("date") result.get("thumbnail") result.get("sitelinks")这些字段同样不保证每次都存在。10. 其他常用返回字段 除了例程中的三个主要字段,SerpApi 还可能返回下面这些内容。 search_metadata 搜索任务的元信息: metadata = results.get("search_metadata",{}, )常见内容包括: metadata.get("id") metadata.get("status") metadata.get("created_at") metadata.get("processed_at") metadata.get("total_time_taken")其中:id:SerpApi 搜索任务 ID; status:搜索任务状态; total_time_taken:请求处理时间。search_parameters 记录当前搜索实际使用的参数: search_parameters = results.get("search_parameters",{}, )调试时可以打印: print(search_parameters)检查 engine、q、gl、hl、device 等参数是否生效。 search_information 记录搜索结果的基本信息: search_information = results.get("search_information",{}, )可能包含: search_information.get("query_displayed") search_information.get("total_results") search_information.get("page_number") search_information.get("time_taken_displayed")related_questions Google 搜索中的“其他用户还问了”: related_questions = results.get("related_questions",[], )单条内容可能包括: question.get("question") question.get("snippet") question.get("title") question.get("link")related_searches Google 搜索页面底部的相关搜索词: related_searches = results.get("related_searches",[], )常见字段包括: item.get("query") item.get("link")serpapi_pagination 分页信息: pagination = results.get("serpapi_pagination",{}, )可以从中获取下一页搜索地址或其他页码信息。 其他可能出现的字段 根据查询内容和搜索类型,还可能出现: results.get("images_results") results.get("news_results") results.get("top_stories") results.get("local_results") results.get("shopping_results") results.get("video_results") results.get("recipes_results") results.get("events_results") results.get("ai_overview")这些字段并不是每次搜索都会返回。 SerpApi 返回哪些字段,取决于 Google 当前搜索页面中实际出现了哪些模块。 因此,不能假设某个字段一定存在。11. 异常处理 SerpApi 请求可能因为网络、API Key、账户额度或请求参数等原因失败。 请求超时 except serpapi.TimeoutError:return "搜索时发生错误:SerpApi 请求超时。"当请求超过客户端设置的 timeout 时,会进入这个分支。 HTTP 错误 except serpapi.HTTPError as error:return f"搜索时发生 HTTP 错误:{error}"常见 HTTP 错误包括: 400:请求参数错误或缺少必要参数 401:API Key 无效 429:请求频率超过限制或账户额度不足如果需要进一步区分,可以读取状态码: except serpapi.HTTPError as error:if error.status_code == 401:return "错误:SerpApi API Key 无效。"if error.status_code == 429:return "错误:请求过于频繁或搜索额度不足。"return f"SerpApi HTTP 错误:{error}"其他异常 except Exception as error:return f"搜索时发生错误:{error}"用于捕获未预料到的其他错误,避免搜索工具导致整个 Agent 程序直接退出。12. if __name__ == "__main__" 的作用 if __name__ == "__main__":result = search("什么是人工智能 Agent")print("\n搜索结果:")print(result)直接运行当前文件时: python search.py测试代码会执行。 如果当前文件被其他模块导入: from search import search测试代码不会自动执行。 因此,search.py 既可以独立测试,也可以作为 Agent 项目中的搜索工具模块使用。六、运行结果 运行: python search.py终端输出: 🔍 正在执行 [SerpApi] 网页搜索:什么是人工智能 Agent搜索结果: AI agent (AI 智能体) 是一种通过使用可用工具设计工作流来自主执行任务的系统。AI agent (AI 智能体) 的功能范围远不止自然语言处理,还包括决策制定、问题求解、与外部环境交互以及执行各种操作。这说明程序成功完成了以下过程: 读取 .env 中的 API Key↓ 创建 SerpApi Client↓ 向 SerpApi 提交 Google 搜索请求↓ 获得结构化搜索结果↓ 从 answer_box 中读取直接答案↓ 将答案返回并打印由于 Google 搜索结果会受到时间、地区、语言和页面结构的影响,所以不同时间运行时,具体输出内容可能有所不同。 如果搜索结果中没有 answer_box,程序会继续尝试读取 knowledge_graph。 如果知识图谱也不存在,则返回前三条普通网页搜索结果。七、总结 使用新版 SerpApi Python SDK 实现一次搜索,核心代码只有以下几步: import serpapiclient = serpapi.Client(api_key="你的API_KEY", )results = client.search({"engine": "google","q": "搜索内容", })得到结果后,可以根据需求读取不同字段: results.get("answer_box", {}) results.get("knowledge_graph", {}) results.get("organic_results", []) results.get("related_questions", []) results.get("related_searches", [])本文完整例程采用了下面的结果解析优先级: Answer Box↓ Knowledge Graph↓ Organic Results这种设计适合作为一个简单的 Agent 搜索工具:有直接答案时,快速返回答案; 没有直接答案时,尝试返回知识图谱; 再没有时,返回普通网页标题、摘要和链接。需要特别注意新版与旧版包的区别。 旧版代码可能使用: from serpapi import SerpApiClient新版官方包应使用: import serpapiclient = serpapi.Client(...)通过 SerpApi,可以较为方便地为 Agent、RAG 和大语言模型应用增加基础的互联网搜索能力,同时避免自行处理搜索页面抓取、验证码、代理和 HTML 解析等问题。
← 返回列表