ChatGPT函数调用实战:赋予AI网页文本抓取新技能

ChatGPT函数调用初体验:让ChatGPT具备抓取网页文本的能力

一、技术背景与需求分析

在自然语言处理(NLP)领域,ChatGPT凭借其强大的语言生成能力已成为标杆工具。然而,传统模式下ChatGPT仅能基于已有知识库生成文本,无法实时获取互联网最新信息。这一局限性在需要动态数据支持的场景中尤为突出,例如市场分析、新闻聚合或学术研究。

开发者面临的痛点在于:如何让ChatGPT突破静态知识边界,实现实时网页内容抓取与分析?函数调用(Function Calling)功能的推出为此提供了技术突破口。通过定义特定函数接口,ChatGPT可在生成文本的同时调用外部工具,实现数据获取与处理的闭环。

二、函数调用技术原理

OpenAI的函数调用机制本质上是构建了一个”智能代理”系统。当用户提出涉及外部数据的需求时,ChatGPT会:

  1. 解析请求中的隐含数据需求
  2. 匹配预先定义的函数库
  3. 生成符合函数参数要求的JSON格式调用指令
  4. 接收函数返回数据并整合到回复中

这种设计模式将AI的语言理解能力与外部工具的执行力有机结合,特别适合网页抓取这类需要与互联网交互的场景。

三、实现网页文本抓取的关键步骤

1. 函数定义与注册

首先需要定义一个用于网页抓取的函数,示例如下:

  1. def fetch_webpage(url: str, selector: str = None) -> dict:
  2. """
  3. 网页抓取函数
  4. :param url: 目标网页URL
  5. :param selector: CSS选择器(可选)
  6. :return: 包含标题和内容的字典
  7. """
  8. import requests
  9. from bs4 import BeautifulSoup
  10. try:
  11. headers = {'User-Agent': 'Mozilla/5.0'}
  12. response = requests.get(url, headers=headers, timeout=10)
  13. soup = BeautifulSoup(response.text, 'html.parser')
  14. if selector:
  15. content = soup.select_one(selector).get_text(strip=True)
  16. else:
  17. # 默认抓取<main>或<article>标签内容
  18. main_content = soup.find('main') or soup.find('article')
  19. content = main_content.get_text(strip=True) if main_content else ""
  20. return {
  21. "title": soup.title.string if soup.title else "",
  22. "content": content[:5000], # 限制返回长度
  23. "success": True
  24. }
  25. except Exception as e:
  26. return {"error": str(e), "success": False}

2. 函数描述文档

关键在于为函数编写符合OpenAI规范的描述文档,这决定了ChatGPT能否准确调用:

  1. {
  2. "functions": [
  3. {
  4. "name": "fetch_webpage",
  5. "description": "抓取指定网页的文本内容",
  6. "parameters": {
  7. "type": "object",
  8. "properties": {
  9. "url": {
  10. "type": "string",
  11. "description": "目标网页的完整URL"
  12. },
  13. "selector": {
  14. "type": "string",
  15. "description": "可选的CSS选择器,用于精确定位内容"
  16. }
  17. },
  18. "required": ["url"]
  19. }
  20. }
  21. ]
  22. }

3. 调用流程实现

实际调用时需要建立请求-响应循环:

  1. import openai
  2. def call_chatgpt_with_functions(prompt, functions):
  3. messages = [{"role": "user", "content": prompt}]
  4. while True:
  5. response = openai.ChatCompletion.create(
  6. model="gpt-4-0613", # 需使用支持函数调用的版本
  7. messages=messages,
  8. functions=functions,
  9. function_call="auto"
  10. )
  11. request = response.choices[0].message
  12. # 检查是否需要调用函数
  13. if request.get("function_call"):
  14. function_name = request["function_call"]["name"]
  15. arguments = eval(request["function_call"]["arguments"]) # 注意安全风险
  16. # 执行实际函数调用
  17. if function_name == "fetch_webpage":
  18. result = fetch_webpage(arguments["url"], arguments.get("selector"))
  19. # 将结果返回给ChatGPT继续处理
  20. messages.append({
  21. "role": "function",
  22. "name": function_name,
  23. "content": str(result)
  24. })
  25. else:
  26. return request.get("content")

四、实际应用场景与优化

1. 精准内容提取

通过CSS选择器参数可实现精细控制:

  1. # 抓取特定新闻网站的标题和正文
  2. prompt = "请分析新浪财经最新关于AI的报道,提取标题和正文"
  3. functions = [...] # 前文定义的函数描述
  4. result = call_chatgpt_with_functions(prompt, functions)

2. 错误处理机制

需建立三级错误处理体系:

  • 网络层:重试机制+备用源
  • 解析层:多选择器回退策略
  • AI层:错误描述转自然语言

3. 性能优化技巧

  • 缓存机制:对高频访问页面建立本地缓存
  • 异步处理:使用Celery等工具实现并发抓取
  • 增量更新:通过ETag或Last-Modified实现差异抓取

五、安全与伦理考量

1. 合法性合规

必须遵守:

  • robots.txt协议
  • 《网络安全法》相关条款
  • 目标网站的Terms of Service

2. 反爬策略应对

建议采用:

  • 动态User-Agent轮换
  • 代理IP池
  • 请求频率控制(建议不超过1次/秒)

3. 数据隐私保护

  • 避免抓取包含个人信息的字段
  • 建立数据脱敏流程
  • 符合GDPR等隐私法规

六、进阶应用方向

1. 多模态抓取

结合OCR和计算机视觉技术,可扩展抓取图片中的文字或PDF文档内容。

2. 动态内容处理

通过分析JavaScript渲染的网页,可抓取AJAX加载的动态内容。

3. 智能解析引擎

结合ChatGPT的文本理解能力,可自动识别:

  • 文章结构(引言/正文/结论)
  • 关键数据点
  • 情感倾向分析

七、完整实现示例

  1. # 完整流程示例
  2. import openai
  3. from typing import Dict, Any
  4. def initialize_chat():
  5. functions = [{
  6. "name": "fetch_webpage",
  7. "description": "抓取网页内容",
  8. "parameters": {
  9. "type": "object",
  10. "properties": {
  11. "url": {"type": "string", "description": "网页URL"},
  12. "selector": {"type": "string", "description": "CSS选择器"}
  13. },
  14. "required": ["url"]
  15. }
  16. }]
  17. return functions
  18. def process_user_query(query: str, functions: list) -> str:
  19. messages = [{"role": "user", "content": query}]
  20. while True:
  21. response = openai.ChatCompletion.create(
  22. model="gpt-4-0613",
  23. messages=messages,
  24. functions=functions,
  25. function_call="auto"
  26. )
  27. message = response.choices[0].message
  28. if message.get("function_call"):
  29. args = eval(message["function_call"]["arguments"])
  30. result = fetch_webpage(args["url"], args.get("selector"))
  31. messages.append({
  32. "role": "function",
  33. "name": "fetch_webpage",
  34. "content": str(result)
  35. })
  36. else:
  37. return message.get("content", "未能获取有效回复")
  38. # 使用示例
  39. if __name__ == "__main__":
  40. functions = initialize_chat()
  41. user_query = "请抓取https://tech.sina.com.cn/ai/的最新AI行业分析文章"
  42. print(process_user_query(user_query, functions))

八、未来发展趋势

随着GPT-5等更强大模型的推出,函数调用将向更智能的方向发展:

  1. 自动函数生成:根据需求动态创建抓取函数
  2. 语义选择器:通过自然语言描述定位元素
  3. 多步骤推理:自动规划抓取-分析-总结的完整流程

这种技术演进将使ChatGPT从单纯的文本生成工具,进化为具备自主数据获取能力的智能代理,为开发者打开全新的应用空间。