易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化


易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化 🚀🌐🕷️

1.34.1 学习目标 🎯

作为《易语言开发从入门到精通》的网络编程进阶+实用爬虫开发补充篇·自动化数据采集与API集成实战·电商/金融/政务数据分析加速器 ,本章将帮你构建完整的网络编程进阶+爬虫开发思维体系,完成3个高实用价值的项目,大幅提升数据采集和处理效率,达成以下4重可落地的明确目标:

  1. 构建网络编程进阶的三层思维框架:掌握"基础通信(HTTPS/异步/代理)→数据解析(JSON/XML/正则/XPath)→实战应用(API测试/爬虫/数据监控)"的三层标准化开发模式;
  2. 掌握网络编程核心进阶技能:学会HTTPS通信、异步并发请求、动态代理IP配置、HTTP请求头优化、Cookie自动管理;
  3. 掌握主流数据解析方法:精通常用的JSON、XML、HTML数据解析,学会使用XPath、CSS选择器、正则表达式提取复杂网页信息;
  4. 开发3个高实用价值的项目 :完成API接口测试工具京东商城评论自动采集爬虫全国天气数据实时监控与邮件推送系统
  5. 掌握网络编程的性能优化与防封禁经验:学习请求频率控制、用户代理池、会话保持、验证码识别(简单字符验证码)、异常处理的方法。

1.34.2 网络编程进阶+实用爬虫开发的核心思维框架------三层标准化开发模式 🧠

网络编程进阶+实用爬虫开发的本质是通过网络协议获取数据,并对数据进行解析和处理,三层标准化开发模式可以帮助你快速解决90%以上的项目需求。

1.34.2.1 三层标准化开发模式的功能划分

第一层:基础通信层

  • 功能:负责与目标服务器建立网络连接,发送HTTP/HTTPS请求,接收服务器响应;
  • 常用方法:使用精易模块的"网页_访问对象"函数(支持GET/POST/异步/代理),使用WinHTTP支持库的HTTP通信函数;
  • 注意事项:要处理HTTPS证书验证问题,要配置合理的请求超时时间,要使用正确的HTTP方法;

第二层:数据解析层

  • 功能:负责解析服务器响应的数据,提取需要的信息;
  • 常用方法:使用JSON支持库解析JSON格式数据,使用XML支持库解析XML格式数据,使用正则表达式支持库解析HTML格式数据,使用精易模块的"网页_取节点文本"函数(支持XPath、CSS选择器);
  • 注意事项:要处理数据格式错误的问题,要优化解析效率,要避免解析过程中的内存泄漏;

第三层:实战应用层

  • 功能:负责将解析后的数据进行处理和展示,如保存到数据库、导出到Excel文件、发送邮件、定时任务;
  • 常用方法:使用SQLite支持库保存数据到数据库,使用eExcel支持库导出数据到Excel文件,使用精易模块的"邮件_发送邮件"函数发送邮件,使用时钟组件实现定时任务;
  • 注意事项:要处理数据存储和导出的错误,要优化定时任务的执行效率,要避免资源泄漏;

1.34.3 网络编程进阶+实用爬虫开发深度实战------3个高实用价值的项目 📱

现在,我们来开发3个高实用价值的网络编程进阶+爬虫开发项目,这些项目将用到所有三层标准化开发模式的技术,覆盖API接口测试、电商评论采集、天气数据监控。

1.34.3.1 项目1:API接口测试工具 📊

项目需求分析

功能需求

  • 基础功能:支持GET和POST请求方式,支持设置请求参数(URL参数、表单参数、JSON参数),支持设置请求头(User-Agent、Referer、Cookie),支持发送HTTP和HTTPS请求;
  • 数据解析功能:支持解析JSON格式的响应数据,支持格式化显示响应数据,支持导出响应数据到JSON文件;
  • 辅助功能 :支持显示请求耗时,支持显示响应状态码,支持保存和加载测试用例,支持测试用例的管理;
    非功能需求
  • 界面设计:符合现代审美(扁平化风格、蓝色渐变主题),功能分区明确(请求设置区、响应显示区、辅助功能区);
  • 用户体验:请求参数和请求头支持批量导入和导出,响应数据支持搜索和复制,添加请求失败的提示信息;
  • 响应时间:程序响应时间不超过1秒,请求响应时间不超过10秒;

界面设计 (组件箱拖拽+属性表配置):

新建Windows窗口程序 :打开易语言官方IDE,点击"文件→新建→Windows窗口程序→确定";

添加容器组件 :从组件箱中拖拽3个分组框组件到"_启动窗口"上,属性名分别为"_分组框_请求设置区""_分组框_响应显示区""_分组框_辅助功能区",标题分别为"请求设置区""响应显示区""辅助功能区",位置分别为(10,10)、(10,250)、(520,10),宽度分别为500px、500px、300px,高度分别为230px、240px、480px;

添加请求设置区组件

  • 1个组合框组件:属性名分别为"_组合框_请求方式",标题为"请求方式:",位置为(20,15),宽度为80px,高度为25px,列表项为"GET|POST";
  • 1个编辑框组件:属性名分别为"_编辑框_URL",标题为"请求URL:",位置为(110,15),宽度为380px,高度为25px;
  • 2个单选框组件:属性名分别为"_单选框_URL参数""_单选框_表单参数""_单选框_JSON参数",标题分别为"URL参数""表单参数""JSON参数",位置分别为(20,50)、(20,80)、(20,110);
  • 2个编辑框组件:属性名分别为"_编辑框_请求参数""_编辑框_请求头",位置分别为(20,140)、(20,180),宽度分别为460px、460px,高度分别为50px、30px,多行显示为真;
  • 1个按钮组件 :属性名分别为"_按钮_发送请求",标题为"发送请求",位置为(200,210),宽度为120px,高度为30px;
    添加响应显示区组件
  • 1个编辑框组件:属性名分别为"_编辑框_响应状态码",标题为"响应状态码:",位置为(20,15),宽度为100px,高度为25px,可用为假;
  • 1个编辑框组件:属性名分别为"_编辑框_请求耗时",标题为"请求耗时:",位置为(130,15),宽度为100px,高度为25px,可用为假;
  • 1个超文本浏览框组件:属性名分别为"_超文本浏览框_响应数据",位置为(20,45),宽度为460px,高度为180px;
  • 1个按钮组件 :属性名分别为"_按钮_格式化响应数据",标题为"格式化响应数据",位置为(360,15),宽度为120px,高度为25px;
    添加辅助功能区组件
  • 2个标签组件:属性名分别为"_标签_测试用例名称""_标签_测试用例描述",标题分别为"测试用例名称:""测试用例描述:",位置分别为(20,20)、(20,50);
  • 2个编辑框组件:属性名分别为"_编辑框_测试用例名称""_编辑框_测试用例描述",位置分别为(120,20)、(120,50),宽度分别为160px、160px,高度统一为25px;
  • 3个按钮组件:属性名分别为"_按钮_保存测试用例""_按钮_加载测试用例""_按钮_删除测试用例",标题分别为"保存测试用例""加载测试用例""删除测试用例",位置分别为(20,80)、(130,80)、(240,80),宽度分别为100px、100px、100px,高度统一为25px;
  • 1个列表框组件:属性名分别为"_列表框_测试用例列表",位置为(20,120),宽度为260px,高度为340px;
  • 1个时钟组件:属性名分别为"_时钟_请求超时",时钟周期为10000,可见为假;
  • 1个通用对话框组件 :属性名分别为"_通用对话框_保存测试用例""_通用对话框_加载测试用例""_通用对话框_导出响应数据",类型分别为"保存文件""打开文件""保存文件",过滤器分别为"测试用例文件 (.json)| .json|所有文件 (. )|. ""测试用例文件 (.json)| .json|所有文件 (. )|. ""JSON文件 (.json)| .json|所有文件 (. )|.",初始目录为程序的运行目录;

代码实现(分模块详细代码+注释):

模块1:启动窗口事件驱动代码
e 复制代码
.版本 2
.支持库 spec
.支持库 eFile
.支持库 iext
.支持库 json
.支持库 wininet

.程序集 窗口程序集_启动窗口
.程序集变量 请求参数类型, 整数型    ' 0:URL参数,1:表单参数,2:JSON参数
.程序集变量 请求开始时间, 整数型    ' 存储请求开始时间
.程序集变量 请求超时, 逻辑型       ' 存储请求超时状态

.子程序 _启动窗口_创建完毕
    ' 设置请求参数类型的默认值
    _单选框_URL参数.选中 = 真
    请求参数类型 = 0
    
    ' 初始化请求头的默认值
    _编辑框_请求头.内容 = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"

.子程序 _启动窗口_将被销毁
    ' 停止请求超时的时钟
    _时钟_请求超时.时钟周期 = 0

.子程序 _单选框_URL参数_被单击, , , 选中
    .如果真 (选中 = 真)
        请求参数类型 = 0
    .如果真结束

.子程序 _单选框_表单参数_被单击, , , 选中
    .如果真 (选中 = 真)
        请求参数类型 = 1
    .如果真结束

.子程序 _单选框_JSON参数_被单击, , , 选中
    .如果真 (选中 = 真)
        请求参数类型 = 2
    .如果真结束

.子程序 _按钮_发送请求_被单击
    ' 检查请求URL是否为空
    .如果真 (_编辑框_URL.内容 = "")
        信息框 ("请输入请求URL!", #错误图标, "API接口测试工具")
        返回 ()
    .如果真结束
    
    ' 检查请求参数是否为空(如果请求方式为POST)
    .如果真 (_组合框_请求方式.现行选中项 = 1 且 _编辑框_请求参数.内容 = "")
        信息框 ("请输入请求参数!", #错误图标, "API接口测试工具")
        返回 ()
    .如果真结束
    
    ' 开始发送请求
    _时钟_请求超时.时钟周期 = 10000
    请求超时 = 假
    请求开始时间 = 取启动时间 ()
    
    ' 发送HTTP/HTTPS请求
    .局部变量 请求结果, 文本型
    请求结果 = 发送HTTP请求 ()
    
    ' 停止请求超时的时钟
    _时钟_请求超时.时钟周期 = 0
    
    ' 检查请求是否超时
    .如果真 (请求超时 = 真)
        信息框 ("请求超时!", #错误图标, "API接口测试工具")
        返回 ()
    .如果真结束
    
    ' 显示请求结果
    显示请求结果 (请求结果)

.子程序 发送HTTP请求, 文本型    ' 返回:响应数据
    .局部变量 请求对象, 对象
    请求对象.创建 ("WinHttp.WinHttpRequest.5.1")
    
    ' 打开请求
    请求对象.数值方法 ("Open", _组合框_请求方式.内容, _编辑框_URL.内容, 假)
    
    ' 设置请求头
    .局部变量 请求头数组, 文本型, , "0"
    请求头数组 = 分割文本 (_编辑框_请求头.内容, #换行符, )
    
    .局部变量 i, 整数型
    .计次循环首 (取数组成员数 (请求头数组), i)
        .如果真 (请求头数组 [i] = "")
            继续循环 ()
        .如果真结束
        
        .局部变量 请求头数组_temp, 文本型, , "0"
        请求头数组_temp = 分割文本 (请求头数组 [i], ":", )
        
        .如果真 (取数组成员数 (请求头数组_temp) < 2)
            继续循环 ()
        .如果真结束
        
        请求对象.数值方法 ("SetRequestHeader", 请求头数组_temp [1], 文本_删除前导和尾随空格 (请求头数组_temp [2]))
    .计次循环尾 ()
    
    ' 设置请求超时时间
    请求对象.写属性 ("SetTimeouts", 10000, 10000, 10000, 10000)
    
    ' 发送请求
    .如果真 (_组合框_请求方式.现行选中项 = 0)
        ' GET请求
        请求对象.数值方法 ("Send", )
    .如果真结束
    
    .如果真 (_组合框_请求方式.现行选中项 = 1)
        ' POST请求
        .判断开始 (请求参数类型 = 0)
            ' URL参数
            请求对象.数值方法 ("Send", )
        .判断 (请求参数类型 = 1)
            ' 表单参数
            请求对象.数值方法 ("Send", _编辑框_请求参数.内容)
        .判断 (请求参数类型 = 2)
            ' JSON参数
            请求对象.数值方法 ("SetRequestHeader", "Content-Type", "application/json")
            请求对象.数值方法 ("Send", _编辑框_请求参数.内容)
        .默认
        .判断结束
    .如果真结束
    
    ' 读取响应数据
    .局部变量 响应数据, 文本型
    响应数据 = 请求对象.读属性 ("ResponseText")
    
    ' 释放请求对象
    请求对象.释放 ()
    
    返回 (响应数据)

.子程序 显示请求结果, , , 参数:响应数据
    .参数 响应数据, 文本型
    
    ' 显示响应状态码
    _编辑框_响应状态码.内容 = 到文本 (WinHttp取响应状态码 (_编辑框_URL.内容))
    
    ' 显示请求耗时
    _编辑框_请求耗时.内容 = 到文本 (取启动时间 () - 请求开始时间) + "ms"
    
    ' 显示响应数据
    _超文本浏览框_响应数据.地址 = "about:blank"
    _超文本浏览框_响应数据.执行JS ("document.write('" + 文本_替换 (响应数据, "'", "\\'") + "')")

.子程序 _按钮_格式化响应数据_被单击
    ' 格式化JSON格式的响应数据
    .局部变量 格式化响应数据, 文本型
    格式化响应数据 = JSON格式化 (_超文本浏览框_响应数据.地址)
    
    ' 显示格式化后的响应数据
    _超文本浏览框_响应数据.地址 = "about:blank"
    _超文本浏览框_响应数据.执行JS ("document.write('" + 文本_替换 (格式化响应数据, "'", "\\'") + "')")

.子程序 _时钟_请求超时_周期事件
    ' 请求超时
    请求超时 = 真
    _时钟_请求超时.时钟周期 = 0

.子程序 文本_删除前导和尾随空格, 文本型    ' 参数:原文本,返回:删除前导和尾随空格后的文本
    .参数 原文本, 文本型
    
    .局部变量 i, 整数型
    i = 1
    
    ' 删除前导空格
    .判断循环首 (i ≤ 取文本长度 (原文本) 且 (取文本中间 (原文本, i, 1) = " " 或 取文本中间 (原文本, i, 1) = #制表符))
        i = i + 1
    .判断循环尾 ()
    
    ' 删除尾随空格
    .局部变量 j, 整数型
    j = 取文本长度 (原文本)
    
    .判断循环首 (j ≥ i 且 (取文本中间 (原文本, j, 1) = " " 或 取文本中间 (原文本, j, 1) = #制表符))
        j = j - 1
    .判断循环尾 ()
    
    返回 (取文本中间 (原文本, i, j - i + 1))

测试调试和优化经验

测试调试

  • 测试GET和POST请求方式是否正常;
  • 测试URL参数、表单参数、JSON参数是否正常;
  • 测试请求头是否正常;
  • 测试响应状态码和请求耗时是否正常;
  • 测试响应数据的格式化是否正常;
    优化经验
  • 优化请求超时时间的设置,根据网络状况调整超时时间;
  • 优化请求对象的释放,避免资源泄漏;
  • 优化响应数据的显示,使用HTML的pre标签保留格式;

1.34.3.2 项目2:京东商城评论自动采集爬虫 🛒

项目需求分析

功能需求

  • 基础功能:支持输入京东商品ID,采集该商品的评论数据(评论内容、评论时间、评论人、评论星级),支持采集多页评论;
  • 数据解析功能:使用JSON支持库解析评论数据,支持提取评论内容的关键词;
  • 辅助功能 :支持显示采集进度,支持保存评论数据到SQLite数据库,支持导出评论数据到Excel文件,支持设置请求频率;
    非功能需求
  • 界面设计:符合现代审美(扁平化风格、红色主题),功能分区明确(商品设置区、采集设置区、进度显示区、数据展示区);
  • 用户体验:采集进度有实时显示,添加采集失败的提示信息,支持暂停和继续采集;
  • 响应时间 :程序响应时间不超过1秒,采集一页评论的时间不超过5秒;
    防封禁需求
  • 支持设置请求频率(如每隔1秒发送一次请求);
  • 支持设置用户代理池;
  • 支持设置Cookie;

界面设计 (组件箱拖拽+属性表配置):

与API接口测试工具类似,只需要修改组件的类型和位置即可。

代码实现(核心公共函数代码):

e 复制代码
.版本 2
.支持库 spec
.支持库 eFile
.支持库 iext
.支持库 eSQLite
.支持库 json
.支持库 wininet

.子程序 京东评论自动采集, , , 参数:商品ID,采集页数
    .参数 商品ID, 文本型
    .参数 采集页数, 整数型
    
    ' 创建SQLite数据库连接
    .局部变量 数据库连接, SQL连接句柄
    数据库连接 = SQL打开数据库 (取运行目录 () + "/京东评论数据.db")
    
    ' 检查数据库连接是否成功
    .如果真 (数据库连接 = 0)
        调试输出 ("SQLite数据库连接失败:" + SQL取错误信息 ())
        返回 ()
    .如果真结束
    
    ' 创建京东评论数据表
    SQL执行语句 (数据库连接, "CREATE TABLE IF NOT EXISTS jd_comment_data (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        product_id TEXT NOT NULL,
        comment_content TEXT NOT NULL,
        comment_time TEXT NOT NULL,
        commenter TEXT NOT NULL,
        comment_star INTEGER NOT NULL
    )")
    
    ' 设置请求频率
    .局部变量 请求频率, 整数型
    请求频率 = 到数值 (_编辑框_请求频率.内容)
    
    ' 设置用户代理池
    .局部变量 用户代理池, 文本型, , "0"
    用户代理池 = 分割文本 (_编辑框_用户代理池.内容, #换行符, )
    
    ' 设置Cookie
    .局部变量 Cookie, 文本型
    Cookie = _编辑框_Cookie.内容
    
    ' 开始采集评论数据
    .局部变量 采集成功数量, 整数型
    采集成功数量 = 0
    
    .局部变量 采集失败数量, 整数型
    采集失败数量 = 0
    
    .局部变量 i, 整数型
    .计次循环首 (采集页数, i)
        ' 构造评论API接口的URL
        .局部变量 评论API接口URL, 文本型
        评论API接口URL = "https://club.jd.com/comment/productPageComments.action?productId=" + 商品ID + "&score=0&sortType=5&page=" + 到文本 (i - 1) + "&pageSize=10"
        
        ' 发送HTTP请求
        .局部变量 请求结果, 文本型
        请求结果 = 发送HTTP请求_jd (评论API接口URL, 用户代理池, Cookie)
        
        ' 检查请求结果是否为空
        .如果真 (请求结果 = "")
            采集失败数量 = 采集失败数量 + 1
            延迟 (请求频率 * 1000)
            继续循环 ()
        .如果真结束
        
        ' 解析评论数据
        .局部变量 评论数据数组, 文本型, , "0"
        评论数据数组 = 解析京东评论数据 (请求结果)
        
        ' 检查评论数据数组是否为空
        .如果真 (取数组成员数 (评论数据数组) = 0)
            采集失败数量 = 采集失败数量 + 1
            延迟 (请求频率 * 1000)
            继续循环 ()
        .如果真结束
        
        ' 保存评论数据到SQLite数据库
        .局部变量 j, 整数型
        .计次循环首 (取数组成员数 (评论数据数组), j)
            .局部变量 评论数据, 文本型
            评论数据 = 评论数据数组 [j]
            
            .局部变量 解析对象, JSON对象
            解析对象.解析 (评论数据)
            
            .局部变量 评论内容, 文本型
            评论内容 = 解析对象.取成员文本 ("content")
            
            .局部变量 评论时间, 文本型
            评论时间 = 解析对象.取成员文本 ("creationTime")
            
            .局部变量 评论人, 文本型
            评论人 = 解析对象.取成员文本 ("nickname")
            
            .局部变量 评论星级, 整数型
            评论星级 = 解析对象.取成员数值 ("score")
            
            ' 插入评论数据到SQLite数据库
            .局部变量 插入SQL语句, 文本型
            插入SQL语句 = "INSERT INTO jd_comment_data (product_id, comment_content, comment_time, commenter, comment_star) VALUES ('" + 商品ID + "', '" + 文本_替换 (评论内容, "'", "''") + "', '" + 评论时间 + "', '" + 文本_替换 (评论人, "'", "''") + "', " + 到文本 (评论星级) + ")"
            
            SQL执行语句 (数据库连接, 插入SQL语句)
        .计次循环尾 ()
        
        ' 统计采集成功数量
        采集成功数量 = 采集成功数量 + 取数组成员数 (评论数据数组)
        
        ' 显示采集进度
        _编辑框_采集进度.内容 = "正在采集第" + 到文本 (i) + "页,共采集到" + 到文本 (采集成功数量) + "条评论"
        
        ' 延迟发送请求
        延迟 (请求频率 * 1000)
    .计次循环尾 ()
    
    ' 断开SQLite数据库连接
    SQL关闭数据库 (数据库连接)
    
    ' 显示采集结果
    _编辑框_采集成功数量.内容 = 到文本 (采集成功数量)
    _编辑框_采集失败数量.内容 = 到文本 (采集失败数量)
    
    信息框 ("评论采集成功!共采集" + 到文本 (采集成功数量 + 采集失败数量) + "条评论,其中成功" + 到文本 (采集成功数量) + "条,失败" + 到文本 (采集失败数量) + "条!", #信息图标, "京东商城评论自动采集爬虫")

.子程序 发送HTTP请求_jd, 文本型    ' 参数:URL,用户代理池,Cookie,返回:响应数据
    .参数 URL, 文本型
    .参数 用户代理池, 文本型, , "0"
    .参数 Cookie, 文本型
    
    .局部变量 请求对象, 对象
    请求对象.创建 ("WinHttp.WinHttpRequest.5.1")
    
    ' 打开请求
    请求对象.数值方法 ("Open", "GET", URL, 假)
    
    ' 设置请求头
    .局部变量 用户代理, 文本型
    用户代理 = 用户代理池 [取随机数 (1, 取数组成员数 (用户代理池))]
    
    请求对象.数值方法 ("SetRequestHeader", "User-Agent", 用户代理)
    请求对象.数值方法 ("SetRequestHeader", "Referer", "https://item.jd.com/" + 取文本中间 (URL, 寻找文本 (URL, "productId=", , 真) + 10, 10) + ".html")
    请求对象.数值方法 ("SetRequestHeader", "Cookie", Cookie)
    
    ' 设置请求超时时间
    请求对象.写属性 ("SetTimeouts", 10000, 10000, 10000, 10000)
    
    ' 发送请求
    请求对象.数值方法 ("Send", )
    
    ' 读取响应数据
    .局部变量 响应数据, 文本型
    响应数据 = 请求对象.读属性 ("ResponseText")
    
    ' 释放请求对象
    请求对象.释放 ()
    
    返回 (响应数据)

.子程序 解析京东评论数据, 文本型, , "0"    ' 参数:响应数据,返回:评论数据数组(JSON格式)
    .参数 响应数据, 文本型
    
    .局部变量 解析对象, JSON对象
    解析对象.解析 (响应数据)
    
    .局部变量 评论数据数组, 文本型, , "0"
    
    .局部变量 评论列表, JSON数组
    评论列表.取数组数据 (解析对象.取成员 ("comments"), )
    
    .局部变量 i, 整数型
    .计次循环首 (评论列表.取成员数 (), i)
        .局部变量 评论数据, 文本型
        评论数据 = 评论列表.取成员对象 (i - 1).到JSON文本 ()
        
        加入成员 (评论数据数组, 评论数据)
    .计次循环尾 ()
    
    返回 (评论数据数组)

测试调试和优化经验

测试调试

  • 测试输入商品ID是否正常;
  • 测试采集多页评论是否正常;
  • 测试请求频率控制是否正常;
  • 测试用户代理池是否正常;
  • 测试Cookie是否正常;
  • 测试评论数据的保存和导出是否正常;
    优化经验
  • 优化请求频率控制,根据京东的反爬机制调整请求频率;
  • 优化用户代理池,定期更新用户代理池;
  • 优化Cookie管理,定期更新Cookie;
  • 优化评论数据的解析,提高解析效率;

1.34.3.3 项目3:全国天气数据实时监控与邮件推送系统 ☁️📧

项目需求分析

功能需求

  • 基础功能:支持输入城市名称,采集该城市的天气数据(温度、湿度、风力、风向、天气状况),支持设置采集频率;
  • 数据解析功能:使用JSON支持库解析天气数据;
  • 辅助功能 :支持显示天气数据,支持保存天气数据到SQLite数据库,支持导出天气数据到Excel文件,支持设置异常告警阈值(如温度超过35℃),支持发送邮件告警;
    非功能需求
  • 界面设计:符合现代审美(扁平化风格、蓝色主题),功能分区明确(城市设置区、采集设置区、天气显示区、异常告警区);
  • 用户体验:天气数据有实时显示,添加采集失败和异常告警的提示信息;
  • 响应时间:程序响应时间不超过1秒,采集天气数据的时间不超过5秒;

界面设计 (组件箱拖拽+属性表配置):

与API接口测试工具类似,只需要修改组件的类型和位置即可。

代码实现(核心公共函数代码):

e 复制代码
.版本 2
.支持库 spec
.支持库 eFile
.支持库 iext
.支持库 eSQLite
.支持库 json
.支持库 wininet
.支持库 anim

.子程序 天气数据实时监控, , , 参数:城市名称,采集频率,异常告警阈值
    .参数 城市名称, 文本型
    .参数 采集频率, 整数型
    .参数 异常告警阈值, 小数型
    
    ' 创建SQLite数据库连接
    .局部变量 数据库连接, SQL连接句柄
    数据库连接 = SQL打开数据库 (取运行目录 () + "/天气数据.db")
    
    ' 检查数据库连接是否成功
    .如果真 (数据库连接 = 0)
        调试输出 ("SQLite数据库连接失败:" + SQL取错误信息 ())
        返回 ()
    .如果真结束
    
    ' 创建天气数据表
    SQL执行语句 (数据库连接, "CREATE TABLE IF NOT EXISTS weather_data (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        city_name TEXT NOT NULL,
        temperature REAL NOT NULL,
        humidity REAL NOT NULL,
        wind_force TEXT NOT NULL,
        wind_direction TEXT NOT NULL,
        weather_condition TEXT NOT NULL,
        collection_time TEXT NOT NULL
    )")
    
    ' 开始实时监控天气数据
    .循环判断首 ()
        ' 构造天气API接口的URL
        .局部变量 天气API接口URL, 文本型
        天气API接口URL = "https://free-api.heweather.net/s6/weather/now?location=" + 到半角 (城市名称) + "&key=你的天气API密钥"
        
        ' 发送HTTP请求
        .局部变量 请求结果, 文本型
        请求结果 = 发送HTTP请求_weather (天气API接口URL)
        
        ' 检查请求结果是否为空
        .如果真 (请求结果 = "")
            延迟 (采集频率 * 1000)
            继续循环 ()
        .如果真结束
        
        ' 解析天气数据
        .局部变量 天气数据, 文本型
        天气数据 = 解析天气数据 (请求结果)
        
        ' 检查天气数据是否为空
        .如果真 (天气数据 = "")
            延迟 (采集频率 * 1000)
            继续循环 ()
        .如果真结束
        
        ' 显示天气数据
        显示天气数据 (天气数据)
        
        ' 保存天气数据到SQLite数据库
        保存天气数据到SQLite数据库 (数据库连接, 天气数据)
        
        ' 检查天气数据是否异常
        检查天气数据是否异常 (天气数据, 异常告警阈值)
        
        ' 延迟发送请求
        延迟 (采集频率 * 1000)
    .循环判断尾 (真)

.子程序 发送HTTP请求_weather, 文本型    ' 参数:URL,返回:响应数据
    .参数 URL, 文本型
    
    .局部变量 请求对象, 对象
    请求对象.创建 ("WinHttp.WinHttpRequest.5.1")
    
    ' 打开请求
    请求对象.数值方法 ("Open", "GET", URL, 假)
    
    ' 设置请求头
    请求对象.数值方法 ("SetRequestHeader", "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
    
    ' 设置请求超时时间
    请求对象.写属性 ("SetTimeouts", 10000, 10000, 10000, 10000)
    
    ' 发送请求
    请求对象.数值方法 ("Send", )
    
    ' 读取响应数据
    .局部变量 响应数据, 文本型
    响应数据 = 请求对象.读属性 ("ResponseText")
    
    ' 释放请求对象
    请求对象.释放 ()
    
    返回 (响应数据)

.子程序 解析天气数据, 文本型    ' 参数:响应数据,返回:天气数据(JSON格式)
    .参数 响应数据, 文本型
    
    .局部变量 解析对象, JSON对象
    解析对象.解析 (响应数据)
    
    .局部变量 天气数据, 文本型
    
    .局部变量 天气数组, JSON数组
    天气数组.取数组数据 (解析对象.取成员 ("HeWeather6"), )
    
    .如果真 (天气数组.取成员数 () > 0)
        天气数据 = 天气数组.取成员对象 (0).取成员 ("now").到JSON文本 ()
    .如果真结束
    
    返回 (天气数据)

.子程序 检查天气数据是否异常, , , 参数:天气数据,异常告警阈值
    .参数 天气数据, 文本型
    .参数 异常告警阈值, 小数型
    
    .局部变量 解析对象, JSON对象
    解析对象.解析 (天气数据)
    
    .局部变量 温度, 小数型
    温度 = 到数值 (解析对象.取成员文本 ("tmp"))
    
    .如果真 (温度 > 异常告警阈值)
        ' 发送邮件告警
        .局部变量 邮件内容, 文本型
        邮件内容 = "城市:" + _编辑框_城市名称.内容 + ",温度:" + 到文本 (温度) + "℃,已超过异常告警阈值(" + 到文本 (异常告警阈值) + "℃)!"
        
        精易模块.邮件_发送邮件 ("smtp.qq.com", "你的QQ邮箱", "你的QQ邮箱授权码", "你的收件人邮箱", "天气数据异常告警", 邮件内容, , )
        
        ' 显示异常告警信息
        _列表框_异常告警.加入项目 (取现行时间 ().格式化 ("YYYY-MM-DD HH:MM:SS") + " - " + 邮件内容)
        _列表框_异常告警.现行选中项 = _列表框_异常告警.取项目数 () - 1
    .如果真结束

测试调试和优化经验

测试调试

  • 测试输入城市名称是否正常;
  • 测试采集天气数据是否正常;
  • 测试采集频率控制是否正常;
  • 测试异常告警阈值设置是否正常;
  • 测试邮件发送是否正常;
    优化经验
  • 优化采集频率控制,根据天气API的调用次数限制调整采集频率;
  • 优化邮件发送,避免频繁发送邮件;
  • 优化天气数据的解析,提高解析效率;

1.34.4 网络编程的性能优化与防封禁经验------提升效率与避免被封 🛡️

网络编程的性能优化和防封禁是两个非常重要的话题,尤其是在开发爬虫项目时。为了帮助你提升程序的性能和避免被封,我整理了一份网络编程的性能优化与防封禁经验,分为性能优化和防封禁两个部分。

1.34.4.1 性能优化 🚀

使用异步并发请求 :使用精易模块的"网页_访问对象"函数的异步模式,或者使用多线程技术,同时发送多个请求,提高处理效率;

使用分块处理 :处理大文件时,将文件分为多个小块,逐块处理,避免内存不足;

使用缓存机制 :缓存常用的请求结果,避免重复请求;

使用CDN加速:使用CDN加速请求,减少请求时间;

1.34.4.2 防封禁 🛡️

设置请求频率 :设置合理的请求频率,避免短时间内发送大量请求;

使用用户代理池 :使用大量的用户代理,每次请求时随机更换用户代理;

使用代理IP池 :使用大量的代理IP,每次请求时随机更换代理IP;

使用Cookie管理 :使用Cookie管理,模拟用户登录,避免被封;

使用验证码识别 :使用简单字符验证码识别技术,自动识别验证码;

使用异常处理:使用异常处理机制,处理请求失败的情况;


1.34.5 网络编程常见问题排查手册 🚨

在网络编程进阶+实用爬虫开发过程中,你可能会遇到各种各样的问题,有些问题看起来很简单,但解决起来却很麻烦;有些问题看起来很复杂,但解决起来却很简单。为了帮助你快速解决这些问题,我整理了一份网络编程常见问题排查手册,分为五大类,每类3个问题,共15个。

1.34.5.1 基础通信问题(3个)
问题1:发送HTTP请求失败

问题现象 :发送HTTP请求失败,返回空字符串。
原因分析

  • 请求URL格式不正确;
  • 目标服务器未响应;
  • 请求超时时间设置过短;
  • 网络连接失败;
    解决方案
  • 检查请求URL格式是否正确;
  • 检查目标服务器是否未响应;
  • 调整请求超时时间;
  • 检查网络连接是否失败;
问题2:发送HTTPS请求失败

问题现象 :发送HTTPS请求失败,返回空字符串。
原因分析

  • 请求URL格式不正确;
  • 目标服务器的HTTPS证书无效;
  • 请求超时时间设置过短;
  • 网络连接失败;
    解决方案
  • 检查请求URL格式是否正确;
  • 使用精易模块的"网页_访问对象"函数,该函数默认会忽略HTTPS证书验证问题;
  • 调整请求超时时间;
  • 检查网络连接是否失败;
问题3:请求头设置不正确

问题现象 :请求头设置不正确,导致请求失败。
原因分析

  • 请求头格式不正确;
  • 请求头的属性值设置不正确;
  • 缺少必要的请求头属性;
    解决方案
  • 检查请求头格式是否正确;
  • 检查请求头的属性值是否正确;
  • 添加必要的请求头属性,如User-Agent、Referer、Cookie;

1.34.6 补充篇总结与网络编程未来发展方向 📜

1.34.6.1 本章核心收获
  • 构建网络编程进阶的三层思维框架:掌握"基础通信→数据解析→实战应用"的三层标准化开发模式;
  • 掌握网络编程核心进阶技能:学会HTTPS通信、异步并发请求、动态代理IP配置、HTTP请求头优化、Cookie自动管理;
  • 掌握主流数据解析方法:精通常用的JSON、XML、HTML数据解析,学会使用XPath、CSS选择器、正则表达式提取复杂网页信息;
  • 开发3个高实用价值的项目:完成API接口测试工具、京东商城评论自动采集爬虫、全国天气数据实时监控与邮件推送系统;
  • 掌握网络编程的性能优化与防封禁经验:学习请求频率控制、用户代理池、会话保持、验证码识别、异常处理的方法。
1.34.6.2 网络编程未来发展方向

网络编程的未来发展方向主要有以下5个:

💡 AI辅助API测试 :进一步优化AI辅助API测试工具,根据用户的需求自动生成测试用例;

💡 AI辅助爬虫开发 :进一步优化AI辅助爬虫开发工具,根据用户的需求自动构造URL和解析规则;

💡 无代码API集成 :进一步完善无代码API集成平台,让用户通过拖拽和配置的方式集成API;

💡 低代码API开发 :进一步完善低代码API开发平台,让用户通过简单的代码开发API;

💡 AI辅助防封禁:使用AI技术识别和避免被封的风险;


🎉 易语言开发从入门到精通的网络编程进阶+实用爬虫开发补充篇·自动化数据采集与API集成实战·电商/金融/政务数据分析加速器,至此结束!愿你在易语言的世界里,不断学习,不断进步,开发出更多"高效、稳定、防封禁"的网络编程和爬虫项目!

相关推荐
java1234_小锋2 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
铅笔侠_小龙虾2 小时前
Flutter Demo
开发语言·javascript·flutter
2501_944525542 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
福大大架构师每日一题2 小时前
ComfyUI v0.11.1正式发布:新增开发者专属节点支持、API节点强化、Python 3.14兼容性更新等全方位优化!
开发语言·python
wangdaoyin20102 小时前
若依vue2前后端分离集成flowable
开发语言·前端·javascript
向阳开的夏天3 小时前
麒麟V10源码编译QT5.6.3 (x86 & arm64)
开发语言·qt
Evand J3 小时前
【MATLAB例程】TOA和TDOA混合定位,适用于二维平面的高精度定位。锚点数量、位置、测量噪声可自行调节
开发语言·matlab·定位·tdoa
念越4 小时前
数据结构:栈堆
java·开发语言·数据结构
淮北4944 小时前
pip虚拟环境包的问题
开发语言·python·pip