python机器人Agent编程——实现一个本地大模型和爬虫结合的手机号归属地天气查询Agent

一、前言

在本文中,我们将逐步实现一个手机号归属地天气查询agent。这个agent将能够接收用户的手机号输入,自动查询该手机号的归属地,并进一步根据获取的城市信息查询该地区的实时天气信息。我们将使用Python语言,并结合qwen_agent库,及fastapi服务来实现这个功能。
在这里插入图片描述

二、准备工作

首先,确保你已经安装了Python环境和以下库:

  • qwen_agent:用于创建agent的框架。
  • requests:用于发送HTTP请求。
  • phone:用于查询手机号归属地
  • json:用于处理JSON数据。
  • re:用于正则表达式匹配。
  • 本地大模型服务:ollama本地大模型管理软件及qwen大模型。
  • fastapi:用户构建web前端聊天界面
    如果还没有安装这些库,可以通过以下命令安装:
pip install qwen_agent requests #其它所需的模块

这里如果没有装所需的库,运行时会提示,根据提示安装缺的库即可。
没有ollama也先去安装ollama并运行qwen大模型,过程非常简单,网上很多,不再赘述。
在这里插入图片描述

三、Agent结构

qwen智能体基本结构是这样的:先定义工具类tools,然后定义智能体的任务描述,然后创建一个智能体,再然后就是web发布智能体服务,进行双向通讯。
在这里插入图片描述

四、python模块实现

在这里插入图片描述

4.1 实现手机号归属地查询工具

我们首先定义一个工具MobileAddress,用于查询手机号的归属地。这个工具将使用phone库的API调用来获取归属地信息。



@register_tool('get_mobile_address')
class MobileAddress(BaseTool):
    description = '手机号归属地查询服务,输入手机号,返回该手机号的归属地。'
    parameters = [{
        'name': 'mobile',
        'type': 'string',
        'description': '输入的手机号',
        'required': True
    }]

    def call(self, params: str, **kwargs) -> str:  
        print("调用了function:", len(params))
        print("字符串内容:",params)
        
        try:
            params_json = json.loads(params[:-1])
            prompt = params_json["mobile"]
            print("转化后的号码:", prompt)
        except json.JSONDecodeError as e:
            print("JSON解析错误:", e)
            return "参数格式错误"        
        res=p.find(prompt)
        print("原始查询结果:",res)
        return res

4.2实现天气查询工具

接下来,我们定义另一个工具WeatherByAddress,用于根据城市名称查询天气信息。这个工具将使用另一个外部API来获取天气数据。

@register_tool('get_weather')
class WeatherByAddress(BaseTool):
    description = '根据提供的城市名称,查找代码,并通过互联网请求查询天气信息。'
    parameters = [{'name': 'city', 'type': 'string', 'description': '城市名称', 'required': True}]

    def call(self, params: str, **kwargs) -> str:
        try:
            params_json = json.loads(params)
            city_name = params_json["city"]
            # 假设我们有一个城市代码的映射字典
            city_code = {'Beijing': '101010100'}  # 示例代码
            url = f'https://www.weather.com.cn/weather1d/{city_code[city_name]}.shtml'
            response = requests.get(url)
            if response.status_code == 200:
                html_content = response.text
                match = re.search(r'var hour3data=(\{.*?\});', html_content)
                if match:
                    hour3data = match.group(1)
                    return hour3data
                else:
                    return "未找到天气小时数据"
            else:
                return "请求失败,状态码: {}".format(response.status_code)
        except json.JSONDecodeError as e:
            return "参数格式错误"

4.3定义创建Agent主体

最后,我们创建一个Assistant实例,这个agent将使用我们定义的工具来处理用户的输入,并返回归属地和天气信息。

from qwen_agent.agents import Assistant

# 配置LLM
llm_cfg = {
    'model': 'qwen',#这里可以根据自己的大模型类型修改配置参数
    'model_server': 'http://localhost:11434/v1',#这里可以根据自己的大模型类型修改配置参数
    'generate_cfg': {'top_p': 0.8}
}

# 创建agent
system_instruction = '你扮演一个助手,会调用工具,首先获取用户输入的手机号码,并调用手机号归属地查询服务工具获得城市地址,然后再调用天气查询工具获得所在城市的天气信息,最后进行整理,输出手机归属地和天气信息'
tools = ['get_mobile_address', 'get_weather']
bot = Assistant(llm=llm_cfg, system_message=system_instruction, description='function calling', function_list=tools)

4.4创建聊天界面

我们将使用FastAPI来创建一个简单的Web界面,用户可以通过这个界面输入手机号,并获取归属地和天气信息。

from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
    return templates.TemplateResponse("chat.html", {"request": request})

@app.post("/chat")
async def chat(message: str = Form(...)):
    messages = [{'role': 'user', 'content': message}]
    responses = bot.run(messages=messages)
    return {"responses": [content['content'] for content in responses]}

# 运行FastAPI应用
if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host='0.0.0.0', port=9000, workers=1)

创建一个简单的html页面,如下:

<!DOCTYPE html>
<html>
<head>
    <title>Chat Interface</title>
    <script>
        function send_message() {
            var message = document.getElementById("message").value;
            if (message.trim() === "") {
                alert("Message cannot be empty!");
                return;
            }
            fetch("/chat", {
                method: "POST",
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded",
                },
                body: "message=" + encodeURIComponent(message),
            })
            .then(response => {
                if (!response.ok) {
                    throw new Error("Network response was not ok");
                }
                return response.json();
            })
            .then(data => {
                var responses = data.responses;
                var chat_window = document.getElementById("chat-window");
                responses.forEach(response => {
                    var response_div = document.createElement("div");
                    response_div.innerText = response; // Fixed to access response directly
                    chat_window.appendChild(response_div);
                });
                document.getElementById("message").value = "";
                chat_window.scrollTop = chat_window.scrollHeight;
            })
            .catch(error => console.error("Error:", error));
        }
    </script>
</head>
<body>
    <div id="chat-window" style="width: 80%; height: 400px; border: 1px solid #000; overflow-y: scroll;"></div>
    <input type="text" id="message" placeholder="Type a message..." style="height: 100px;width: 80%;">
    <button onclick="send_message()" style="background-color: blue; color: white; font-size: larger; padding: 10px 20px;">Send</button>
</body>
</html>

五、小结

至此,我们实现了一个anget,他可以接收我们输入的电话号码,并且调用本地大模型进行处理,先是调用一个手机号码归属地查询tool,再去调用一个天气查询爬虫tool,最后大模型综合tool的反馈信息进行整合后输出给用户。以上是简单的实现,为了更加的准确好用需要进一步优化,包括qwen-anget本身好像有点问题,有时候只能调用一个手机号码归属地函数发挥不是很稳定因此需要优化prompt,第二,可以加入更多检查工具,比如,输入的号码检查,让大模型自己先检查一下对不对,比如对回答进行一些过滤,过滤掉不必要的信息等。

本篇所有源码及安装虚拟python环境已经打包上传解压运行,下载链接

[------------本篇完-------------]

PS.扩展阅读

————————————————————————————————————————

对于python机器人编程感兴趣的小伙伴,可以进入如下链接阅读相关咨询

ps1.六自由度机器人相关文章资源

(1) 对六自由度机械臂的运动控制及python实现(附源码)
在这里插入图片描述

(2) N轴机械臂的MDH正向建模,及python算法
在这里插入图片描述

ps2.四轴机器相关文章资源

(1) 文章:python机器人编程——用python实现一个写字机器人
在这里插入图片描述

在这里插入图片描述

(2)python机器人实战——0到1创建一个自动是色块机器人项目-CSDN直播

(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(4)实现了语音输入+大模型指令解析+机器视觉+机械臂流程打通
在这里插入图片描述
在这里插入图片描述

ps3.移动小车相关文章资源

(1)python做了一个极简的栅格地图行走机器人,到底能干啥?[第五弹]——解锁蒙特卡洛定位功能-CSDN博客
(2) 对应python资源:源码地址
在这里插入图片描述
在这里插入图片描述

(3)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(上篇)_agv编程-CSDN博客
(4)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)_agv路线规划原则python-CSDN博客
对应python及仿真环境资源:源码链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ps3.wifi小车控制相关文章资源

web端配套资源源代码已经上传(竖屏版),下载地址
仿真配套资源已经上传:下载地址
web端配套资源源代码已经上传(横屏版),下载地址

<think>好的,用户现在问的是“python企业级爬虫用那个方式比较稳定”。首先,我需要回顾之前的对话历史,用户之前询问过关于Selenium在企业级爬虫项目中的应用案例,我详细介绍了几个案例技术实现的关键点。现在用户可能希望了解在Python环境下,企业级爬虫的稳定解决方案,特别是除了Selenium之外的其他方法,或者如何结合使用不同的工具。 用户的问题中提到“稳定”,这可能意味着他们关心系统的可靠性、抗干扰能力、长期运行的维护性等方面。企业级应用通常需要处理大规模数据、高并发、反爬机制、法律合规等问题,所以需要综合考虑这些因素。 首先,我需要确定用户对“稳定”的具体需求是什么。是否指应对反爬措施的能力?还是系统长时间运行的容错性?或者数据抓取的效率准确性?可能需要进一步细化,但根据问题本身,可能需要覆盖多个方面。 接下来,我需要整理Python中常用的爬虫框架工具,比如Scrapy、Requests + BeautifulSoup、Selenium、Playwright等,分析它们的优缺点,以及在企业级环境中的适用性。同时,结合之前提到的Selenium案例,可能用户需要比较Selenium与其他方法在稳定性上的差异。 另外,用户可能想知道如何构建一个稳定的爬虫系统,而不仅仅是选择工具。这包括架构设计、分布式处理、代理管理、数据存储、监控容错机制等。需要将这些方面结合起来,给出综合建议。 可能还需要提到法律合规伦理问题,因为企业级应用必须遵守相关法规,否则即使技术再稳定,也可能面临法律风险。 现在需要结构化地回答,可能分为几个部分:工具选择、架构设计、反反爬策略、监控维护、法律合规等。每个部分给出推荐的工具或方法,并解释为什么它们有助于稳定性。 需要确保回答中提到的工具策略都是当前主流且经过验证的,比如Scrapy的异步处理能力,结合Selenium处理动态页面,使用Scrapy-Redis做分布式,代理池的搭建,以及Celery进行任务调度等。 同时,用户可能对代码示例或具体配置感兴趣,但问题比较偏向方法论,所以可能需要简要提及技术栈,而不过多深入代码细节,除非用户后续追问。 最后,总结时强调没有单一的最佳工具,而是根据具体需求选择合适的组合,并注重系统设计维护,才能确保稳定性。</think>--- ### Python企业级爬虫稳定方案设计与技术选型指南 --- #### 一、企业级稳定性核心要求 - **高可用性**:7×24小时持续运行,故障自动恢复 - **抗干扰能力**:突破反爬限制(IP封锁、验证码、行为检测) - **可扩展性**:支持动态扩容(如分布式架构) - **数据一致性**:保障数据完整性与去重 - **合规安全**:遵守数据抓取协议与隐私保护 --- #### 二、稳定技术方案推荐(组合使用) ##### 1. **基础框架选择** - **Scrapy框架(首选)** - **优势**: - 异步IO架构(Twisted引擎)天然支持高并发 - 内置中间件系统(Middleware Pipeline) - 成熟扩展生态(如`scrapy-redis`分布式支持) - **适用场景**:静态页面快速抓取、结构化数据处理 - **代码示例**: ```python class ProductSpider(scrapy.Spider): name = 'amazon' custom_settings = { 'CONCURRENT_REQUESTS': 32, # 并发控制 'DOWNLOAD_DELAY': 0.5 # 请求间隔 } def parse(self, response): item = {} item['price'] = response.css('span.a-price-whole::text').get() yield item ``` - **Selenium/Playwright(动态渲染补充)** - **优势**: - 完整模拟浏览器行为(点击、滚动、表单提交) - 处理JavaScript渲染页面(如React/Vue单页应用) - **稳定策略**: - 使用`undetected-chromedriver`绕过自动化检测 - 结合`WebDriverWait`智能等待元素加载 ##### 2. **分布式架构** - **Scrapy-Redis方案**: - 基于Redis的任务队列实现分布式调度 - 支持断点续爬与负载均衡 - **Celery+Docker方案**: - 容器化部署爬虫节点 - 动态伸缩Worker数量应对流量波动 ##### 3. **反爬对抗体系** | 反爬类型 | 解决方案 | |----------------|--------------------------------------------------------------------------| | **IP封禁** | 代理池轮换(推荐付费服务如Oxylabs+自建IP池) | | **验证码** | 第三方识别平台(如2Captcha)或深度学习模型(CNN+LSTM) | | **行为指纹** | 修改浏览器指纹(通过`pyppeteer-stealth`伪装) | | **请求频率** | 动态调整延迟(如$ delay = \frac{1}{QPS} + random.uniform(-0.2,0.2) $) | --- #### 三、稳定性增强关键配置 ##### 1. **请求管理优化** ```python # Scrapy中间件示例:自动切换代理 class ProxyMiddleware: def process_request(self, request, spider): request.meta['proxy'] = get_proxy() # 从代理池获取 # Selenium防检测配置 options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) ``` ##### 2. **容错机制设计** - **重试策略**:指数退避重试(如`RETRY_TIMES=3`,$ delay = 2^{retry} $秒) - **异常捕获**: ```python try: element = driver.find_element(By.CSS_SELECTOR, ".price") except NoSuchElementException: logger.error("元素定位失败,页面结构可能已变更") self.retry_request() ``` ##### 3. **监控告警系统** - **Prometheus+Grafana**:实时监控指标(请求成功率、数据抓取量、QPS) - **企业微信/钉钉机器人**:异常通知(如连续失败率>5%触发告警) --- #### 四、典型技术栈组合 | 需求场景 | 推荐技术方案 | |------------------|----------------------------------------------------------------------------| | **高并发抓取** | Scrapy + Scrapy-Redis + Kubernetes(自动扩缩容) | | **动态页面处理** | Playwright + Pyppeteer(轻量级Headless方案) | | **数据存储** | PostgreSQL(关系型) + MongoDB(非结构化) + MinIO(文件存储) | | **任务调度** | Airflow(复杂DAG编排)或 Apache DolphinScheduler(可视化调度) | --- #### 五、最佳实践建议 1. **环境隔离**: - 使用`virtualenv`或`conda`创建独立Python环境 - Docker容器化部署(包含完整依赖) 2. **法律合规检查**: - 定期扫描`robots.txt`变更(如自动解析`User-agent: * Disallow: /private/`) - GDPR合规数据清洗(如手机号脱敏:$ \text{138****5678} $) 3. **性能压测**: - Locust压力测试(模拟$ 1000+ $并发请求) - 优化瓶颈(如启用`HTTP/2`协议、调整TCP连接池大小) --- #### 六、总结 最稳定的Python企业级爬虫方案通常采用**Scrapy核心框架+Playwright/Selenium动态渲染补充+分布式架构**的组合。关键要点: - **动态页面**:优先尝试API逆向工程,次选浏览器自动化 - **反爬对抗**:代理池与请求指纹管理需占整体开发时间的40%以上 - **监控体系**:建立从网络层到业务层的全链路监控 - **成本控制**:平衡自建代理池与第三方服务的成本(建议$ \text{预算占比} \leq 15\% $) 实际项目中,建议通过`A/B测试`验证不同策略的有效性(例如对比`Selenium`与`Playwright`的资源消耗),最终形成适合业务特性的稳定方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机智新语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值