易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化 🚀🌐🕷️
1.34.1 学习目标 🎯
作为《易语言开发从入门到精通》的网络编程进阶+实用爬虫开发补充篇·自动化数据采集与API集成实战·电商/金融/政务数据分析加速器 ,本章将帮你构建完整的网络编程进阶+爬虫开发思维体系,完成3个高实用价值的项目,大幅提升数据采集和处理效率,达成以下4重可落地的明确目标:
- 构建网络编程进阶的三层思维框架:掌握"基础通信(HTTPS/异步/代理)→数据解析(JSON/XML/正则/XPath)→实战应用(API测试/爬虫/数据监控)"的三层标准化开发模式;
- 掌握网络编程核心进阶技能:学会HTTPS通信、异步并发请求、动态代理IP配置、HTTP请求头优化、Cookie自动管理;
- 掌握主流数据解析方法:精通常用的JSON、XML、HTML数据解析,学会使用XPath、CSS选择器、正则表达式提取复杂网页信息;
- 开发3个高实用价值的项目 :完成API接口测试工具 、京东商城评论自动采集爬虫 、全国天气数据实时监控与邮件推送系统;
- 掌握网络编程的性能优化与防封禁经验:学习请求频率控制、用户代理池、会话保持、验证码识别(简单字符验证码)、异常处理的方法。
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集成实战·电商/金融/政务数据分析加速器,至此结束!愿你在易语言的世界里,不断学习,不断进步,开发出更多"高效、稳定、防封禁"的网络编程和爬虫项目!
