易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集 🕷️🌐📊
1.39.1 学习目标 🎯
作为《易语言开发从入门到精通》的网络爬虫与自动化采集分析系统补充篇·企业级/个人高频数据采集场景全覆盖·电商/新闻/社交平台采集实战 ,本章将帮你构建完整的网络爬虫思维体系,完成3个高实用价值的联合项目,掌握数据采集、解析、存储、反爬的全流程技能,达成以下5重可落地的明确目标:
- 构建网络爬虫的五层标准化开发模式:掌握"准备层→采集层→解析层→存储层→部署维护层"的五层标准化开发模式,解决90%以上的网络爬虫需求;
- 掌握核心网络爬虫技术:精通常用的HTTP/HTTPS请求(精易模块/WinINet支持库)、HTML解析(正则表达式/HTMLParser支持库)、JSON解析(JSON支持库)、反爬策略应对(代理IP/用户代理池/请求间隔控制);
- 开发3个高实用价值的联合项目 :完成京东商城商品价格监控与邮件/钉钉告警系统 、新浪新闻资讯自动采集与分类存储系统 、微信公众号文章批量采集与Word/HTML导出系统;
- 掌握数据存储与导出技术:学会将采集到的数据存储到MySQL/SQLite数据库,导出到Excel/CSV/Word/HTML文件;
- 掌握网络爬虫的性能与稳定性优化:学习并发采集(线程池)、代理IP轮换、请求频率控制、异常处理、资源释放的方法;
1.39.2 网络爬虫的核心思维框架------五层标准化开发模式 🧠
网络爬虫的本质是模拟浏览器向服务器发送请求,获取响应数据,解析数据并存储,五层标准化开发模式可以帮助你快速构建稳定、高效的网络爬虫系统。
1.39.2.1 第一层:准备层
- 功能:准备网络爬虫开发所需的支持库、模块、工具、资源;
- 常用工具与资源 :
- 支持库:spec、wininet、json、shell、htmlparser(需手动安装);
- 模块:精易模块(集成了大量常用的网络操作函数)、精易HTMLParser模块(简化HTML解析操作);
- 辅助工具:Chrome浏览器开发者工具(抓包获取接口)、Postman(接口测试)、代理IP池(免费/付费代理IP)、用户代理池(模拟不同浏览器);
- 注意事项:使用代理IP时要选择稳定的代理,使用用户代理池时要定期更新;
1.39.2.2 第二层:采集层
- 功能:模拟浏览器向服务器发送HTTP/HTTPS请求,获取响应数据;
- 常用请求方式:GET请求(获取数据)、POST请求(提交数据);
- 常用响应处理:处理响应状态码、处理响应编码、处理响应数据类型;
- 注意事项:发送请求时要设置合理的请求间隔,避免被服务器封禁IP;
1.39.2.3 第三层:解析层
- 功能:对响应数据进行解析,提取所需的信息;
- 常用解析方法 :
- 解析HTML:使用正则表达式、HTMLParser支持库;
- 解析JSON:使用JSON支持库;
- 注意事项:解析HTML时要注意网页结构的变化,解析JSON时要注意JSON格式的错误;
1.39.2.4 第四层:存储层
- 功能:将解析后的信息存储到数据库或文件;
- 常用存储方式 :
- 数据库存储:MySQL、SQLite;
- 文件存储:Excel、CSV、Word、HTML;
- 注意事项:存储大量数据时要使用分块存储,避免内存不足;
1.39.2.5 第五层:部署维护层
- 功能:负责网络爬虫系统的部署和维护;
- 常用部署方法:将系统编译成可执行文件,使用Windows的任务计划程序设置定时任务,定期更新采集规则;
- 常用维护方法:定期检查系统的运行情况,定期更新代理IP池和用户代理池,定期更新解析规则;
- 注意事项:系统的部署和维护要根据实际需求进行,确保系统的稳定运行;
1.39.3 核心网络爬虫技术详解------HTTP/HTTPS请求·HTML/JSON解析·反爬策略 🔧
1.39.3.1 HTTP/HTTPS请求(精易模块/WinINet支持库)
核心操作 :
✅ 发送GET请求 :使用精易模块的"HTTP_访问"函数;
✅ 发送POST请求 :使用精易模块的"HTTP_访问"函数,参数方式选择#POST;
✅ 设置请求头 :使用精易模块的"HTTP_设置请求头"函数;
✅ 设置用户代理 :使用精易模块的"HTTP_设置请求头"函数,设置User-Agent;
✅ 设置代理IP :使用精易模块的"HTTP_设置代理"函数;
✅ 处理响应数据:使用精易模块的"HTTP_访问"函数返回的响应数据;
代码示例(精易模块发送GET请求):
e
.版本 2
.支持库 spec
.支持库 iext
.支持库 json
.支持库 shell
.支持库 wininet
.程序集 窗口程序集_启动窗口
.程序集变量 代理IP池数组, 文本型, , "0" ' 代理IP池:IP:端口
.程序集变量 用户代理池数组, 文本型, , "0" ' 用户代理池
.程序集变量 当前代理IP索引, 整数型 ' 当前使用的代理IP索引
.程序集变量 当前用户代理索引, 整数型 ' 当前使用的用户代理索引
.子程序 _启动窗口_创建完毕
' 初始化代理IP池
代理IP池数组 = { "192.168.1.100:8080", "192.168.1.101:8080", "192.168.1.102:8080" }
' 初始化用户代理池
用户代理池数组 = { "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/119.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/120.0.0.0 Safari/537.36" }
' 初始化当前代理IP索引和当前用户代理索引
当前代理IP索引 = 1
当前用户代理索引 = 1
.子程序 发送GET请求, 文本型 ' 参数:请求URL,返回:响应数据
.参数 请求URL, 文本型
' 设置用户代理
.局部变量 用户代理, 文本型
用户代理 = 用户代理池数组 [当前用户代理索引]
当前用户代理索引 = 当前用户代理索引 + 1
.如果真 (当前用户代理索引 > 取数组成员数 (用户代理池数组))
当前用户代理索引 = 1
.如果真结束
' 设置代理IP
.局部变量 代理IP, 文本型
代理IP = 代理IP池数组 [当前代理IP索引]
当前代理IP索引 = 当前代理IP索引 + 1
.如果真 (当前代理IP索引 > 取数组成员数 (代理IP池数组))
当前代理IP索引 = 1
.如果真结束
' 发送GET请求
.局部变量 响应数据, 文本型
响应数据 = 精易模块.HTTP_访问 (请求URL, #GET, , "User-Agent: " + 用户代理, )
' 检查响应数据是否成功
.如果真 (响应数据 = "")
返回 ("")
.如果真结束
' 处理响应编码
.局部变量 响应编码, 文本型
响应编码 = 获取响应编码 (响应数据)
.如果真 (响应编码 ≠ "UTF-8" 且 响应编码 ≠ "GBK" 且 响应编码 ≠ "GB2312")
响应编码 = "UTF-8"
.如果真结束
' 转换响应编码
响应数据 = 编码转换 (响应数据, 响应编码, "UTF-8")
返回 (响应数据)
.子程序 获取响应编码, 文本型 ' 参数:响应数据,返回:响应编码
.参数 响应数据, 文本型
.局部变量 编码位置, 整数型
编码位置 = 寻找文本 (响应数据, "charset=", , 真)
.如果真 (编码位置 = -1)
返回 ("UTF-8")
.如果真结束
.局部变量 编码结束位置, 整数型
编码结束位置 = 寻找文本 (响应数据, """", 编码位置 + 8, 真)
.如果真 (编码结束位置 = -1)
编码结束位置 = 寻找文本 (响应数据, ">", 编码位置 + 8, 真)
.如果真结束
.如果真 (编码结束位置 = -1)
返回 ("UTF-8")
.如果真结束
.局部变量 编码, 文本型
编码 = 取文本中间 (响应数据, 编码位置 + 8, 编码结束位置 - 编码位置 - 8)
' 去除编码中的空格
编码 = 子文本替换 (编码, " ", "", , , 真)
' 转换编码为小写
编码 = 到小写 (编码)
返回 (编码)
测试调试和优化经验 :
① 测试调试:
- 使用Chrome浏览器开发者工具测试请求URL是否正确;
- 使用Postman测试请求是否正常;
- 测试响应数据是否完整;
② 优化经验: - 使用代理IP轮换,避免被服务器封禁IP;
- 使用用户代理池,模拟不同浏览器;
- 设置合理的请求间隔,避免服务器压力过大;
1.39.3.2 HTML解析(HTMLParser支持库)
核心操作 :
✅ 解析HTML文档 :使用HTMLParser支持库的"解析HTML文本"函数;
✅ 获取HTML节点 :使用HTMLParser支持库的"获取节点""获取子节点""获取父节点"函数;
✅ 获取节点属性 :使用HTMLParser支持库的"获取节点属性值"函数;
✅ 获取节点文本:使用HTMLParser支持库的"获取节点文本"函数;
代码示例(HTMLParser支持库解析京东商品价格):
e
.版本 2
.支持库 spec
.支持库 iext
.支持库 json
.支持库 shell
.支持库 htmlparser
.程序集 窗口程序集_启动窗口
.子程序 解析京东商品价格, 文本型 ' 参数:响应数据,返回:商品价格
.参数 响应数据, 文本型
' 解析HTML文档
.局部变量 HTML文档对象, 整数型
HTML文档对象 = HTMLParser.解析HTML文本 (响应数据)
' 检查HTML文档对象是否解析成功
.如果真 (HTML文档对象 = 0)
返回 ("")
.如果真结束
' 获取商品价格节点
.局部变量 商品价格节点数组, 整数型, , "0"
商品价格节点数组 = HTMLParser.查找节点 (HTML文档对象, "span", "class", "p-price", , , , )
' 检查商品价格节点数组是否有成员
.如果真 (取数组成员数 (商品价格节点数组) = 0)
HTMLParser.销毁HTML文档 (HTML文档对象)
返回 ("")
.如果真结束
' 获取商品价格节点文本
.局部变量 商品价格文本, 文本型
商品价格文本 = HTMLParser.获取节点文本 (商品价格节点数组 [1])
' 去除商品价格文本中的空格和换行符
商品价格文本 = 子文本替换 (商品价格文本, #换行符, "", , , 真)
商品价格文本 = 子文本替换 (商品价格文本, " ", "", , , 真)
' 提取商品价格
.局部变量 商品价格, 文本型
商品价格 = 精易模块.正则_替换 (商品价格文本, "[^0-9.]", "")
' 销毁HTML文档对象
HTMLParser.销毁HTML文档 (HTML文档对象)
返回 (商品价格)
测试调试和优化经验 :
① 测试调试:
- 使用Chrome浏览器开发者工具查看商品价格节点的HTML结构;
- 测试HTML解析是否成功;
- 测试商品价格是否正确提取;
② 优化经验: - 使用HTMLParser支持库替代正则表达式,提高解析效率和准确性;
- 定期更新解析规则,适应网页结构的变化;
1.39.4 网络爬虫深度实战------3个高实用价值的联合项目 🕷️
1.39.4.1 项目1:京东商城商品价格监控与邮件/钉钉告警系统
项目需求分析 :
✅ 功能需求:
- 基础功能:输入京东商品URL,定时监控商品价格,当价格低于预设阈值时,发送邮件和钉钉群机器人告警;
- 辅助功能 :支持设置监控时间间隔,支持查看监控历史记录,支持导出监控历史记录到Excel文件;
✅ 非功能需求: - 界面设计:符合现代审美(扁平化风格、蓝色主题),功能分区明确(监控设置区、价格显示区、历史记录区);
- 响应时间:价格监控时间间隔不超过1分钟;
- 可靠性:网络断开时要自动重连,邮件和钉钉告警要发送成功;
界面设计 (组件箱拖拽+属性表配置):
① 新建Windows窗口程序 :打开易语言官方IDE,点击"文件→新建→Windows窗口程序→确定";
② 添加容器组件 :从组件箱中拖拽3个分组框组件到"_启动窗口"上,属性名分别为"_分组框_监控设置区""_分组框_价格显示区""_分组框_历史记录区",标题分别为"监控设置区""价格显示区""历史记录区",位置分别为(10,10)、(10,130)、(10,290),宽度分别为780px、780px、780px,高度分别为110px、150px、390px;
③ 添加监控设置区组件:
- 3个标签组件:属性名分别为"_标签_商品URL""_标签_价格阈值""_标签_监控时间间隔",标题分别为"商品URL:""价格阈值:""监控时间间隔:",位置分别为(20,20)、(310,20)、(550,20);
- 2个编辑框组件:属性名分别为"_编辑框_商品URL""_编辑框_价格阈值",内容分别为"https://item.jd.com/100012345678.html""500",位置分别为(100,20)、(390,20),宽度分别为200px、100px,高度统一为25px;
- 1个下拉框组件:属性名分别为"_下拉框_监控时间间隔",位置为(650,20),宽度为120px,高度为25px,添加项目"1分钟""5分钟""10分钟""30分钟""60分钟";
- 3个按钮组件 :属性名分别为"_按钮_开始监控""_按钮_停止监控""_按钮_导出监控历史记录",标题分别为"开始监控""停止监控""导出历史记录",位置分别为(20,60)、(120,60)、(220,60),宽度分别为80px、80px、100px,高度统一为25px;
④ 添加价格显示区组件: - 2个标签组件:属性名分别为"_标签_当前价格""_标签_价格变化趋势",标题分别为"当前价格:""价格变化趋势:",位置分别为(20,20)、(20,70);
- 2个编辑框组件:属性名分别为"_编辑框_当前价格""_编辑框_价格变化趋势",内容分别为"-""-",位置分别为(100,20)、(100,70),宽度分别为150px、150px,高度统一为25px,禁止输入为真;
- 1个图片框组件 :属性名分别为"_图片框_价格变化趋势图表",位置为(270,20),宽度为500px,高度为120px;
⑤ 添加历史记录区组件: - 1个列表框组件 :属性名分别为"_列表框_监控历史记录",位置为(20,20),宽度为740px,高度为350px,允许选择为真;
⑥ 添加支持库和模块: - 添加spec、wininet、json、shell、htmlparser、iext、anim支持库;
- 添加精易模块;
代码实现(核心公共函数代码):
e
.版本 2
.支持库 spec
.支持库 iext
.支持库 json
.支持库 shell
.支持库 htmlparser
.支持库 anim
.支持库 wininet
.程序集 窗口程序集_启动窗口
.程序集变量 监控线程句柄, 整数型 ' 监控线程句柄
.程序集变量 监控状态, 逻辑型 ' 监控状态:真为正在监控,假为停止监控
.程序集变量 监控时间间隔, 整数型 ' 监控时间间隔(秒)
.程序集变量 价格阈值, 小数型 ' 价格阈值(元)
.程序集变量 商品URL, 文本型 ' 商品URL
.程序集变量 监控历史记录数组, 文本型, , "0" ' 监控历史记录数组:时间|价格|状态
.子程序 _启动窗口_创建完毕
' 初始化组件属性
_下拉框_监控时间间隔.现行选中项 = 1
' 初始化监控状态
监控状态 = 假
_按钮_停止监控.禁止 = 真
.子程序 _启动窗口_将被销毁
' 停止监控
.如果真 (监控状态 = 真)
停止监控 ()
.如果真结束
.子程序 _按钮_开始监控_被单击
' 检查输入框是否为空
.如果真 (_编辑框_商品URL.内容 = "" 或 _编辑框_价格阈值.内容 = "")
信息框 ("请输入商品URL和价格阈值!", #错误图标, "京东商城商品价格监控系统")
返回 ()
.如果真结束
' 检查监控状态
.如果真 (监控状态 = 真)
信息框 ("正在监控中,请勿重复点击!", #警告图标, "京东商城商品价格监控系统")
返回 ()
.如果真结束
' 初始化监控参数
商品URL = _编辑框_商品URL.内容
价格阈值 = 到小数 (_编辑框_价格阈值.内容)
监控时间间隔 = 取监控时间间隔 ()
' 清空监控历史记录
_列表框_监控历史记录.清空 ()
监控历史记录数组 = { }
' 启动监控线程
监控线程句柄 = 精易模块.线程_创建 (&监控线程, )
' 检查监控线程句柄是否成功创建
.如果真 (监控线程句柄 = 0)
信息框 ("启动监控线程失败!", #错误图标, "京东商城商品价格监控系统")
return ()
.如果真结束
监控状态 = 真
_按钮_开始监控.禁止 = 真
_按钮_停止监控.禁止 = 假
_编辑框_商品URL.禁止 = 真
_编辑框_价格阈值.禁止 = 真
_下拉框_监控时间间隔.禁止 = 真
测试调试和优化经验 :
① 测试调试:
- 使用Chrome浏览器开发者工具测试商品URL是否正确;
- 测试监控时间间隔是否正常;
- 测试邮件和钉钉告警是否正常;
② 优化经验: - 使用代理IP轮换,避免被京东服务器封禁IP;
- 使用用户代理池,模拟不同浏览器;
- 设置合理的请求间隔,避免服务器压力过大;
1.39.5 网络爬虫的性能与稳定性优化------提升采集效率与稳定性 🚀
1.39.5.1 性能优化
✅ 使用并发采集 :使用线程池技术,同时采集多个网页,提高采集效率;
✅ 使用代理IP轮换 :使用代理IP池,避免被服务器封禁IP;
✅ 使用用户代理池 :使用用户代理池,模拟不同浏览器;
✅ 使用分块解析:解析大量HTML文档时,将文档分为多个小块,逐块解析,避免内存不足;
1.39.5.2 稳定性优化
✅ 使用异常处理机制 :使用try-catch异常处理机制,处理操作失败的情况;
✅ 使用网络重连机制 :网络断开时要自动重连;
✅ 使用请求间隔控制 :设置合理的请求间隔,避免服务器压力过大;
✅ 使用资源释放机制:及时释放资源,避免资源泄漏;
1.39.6 网络爬虫常见问题排查手册 🚨
1.39.6.1 HTTP/HTTPS请求问题(3个)
问题1:发送请求失败
问题现象 :发送请求失败,返回空响应数据。
原因分析:
- 请求URL不正确;
- 网络断开;
- 服务器拒绝连接;
解决方案: - 检查请求URL是否正确;
- 检查网络是否正常;
- 使用代理IP轮换;
问题2:响应数据编码错误
问题现象 :响应数据显示乱码。
原因分析:
- 响应编码不正确;
- 编码转换错误;
解决方案: - 检查响应编码是否正确;
- 优化编码转换函数;
问题3:请求频率过高被封禁IP
问题现象 :发送请求时返回403 Forbidden或503 Service Unavailable。
原因分析:
- 请求频率过高;
- 未使用代理IP;
解决方案: - 设置合理的请求间隔;
- 使用代理IP轮换;
1.39.7 补充篇总结与网络爬虫未来发展方向 📜
1.39.7.1 本章核心收获
- ✅ 构建网络爬虫的五层标准化开发模式:掌握"准备层→采集层→解析层→存储层→部署维护层"的五层标准化开发模式;
- ✅ 掌握核心网络爬虫技术:精通常用的HTTP/HTTPS请求、HTML解析、JSON解析、反爬策略应对;
- ✅ 开发3个高实用价值的联合项目:完成京东商城商品价格监控系统、新浪新闻资讯自动采集系统、微信公众号文章批量采集系统;
- ✅ 掌握数据存储与导出技术:学会将采集到的数据存储到MySQL/SQLite数据库,导出到Excel/CSV/Word/HTML文件;
- ✅ 掌握网络爬虫的性能与稳定性优化:学习并发采集、代理IP轮换、请求频率控制、异常处理、资源释放的方法;
1.39.7.2 网络爬虫未来发展方向
网络爬虫的未来发展方向主要有以下5个:
💡 AI辅助网络爬虫 :进一步优化AI辅助网络爬虫工具,根据网页内容自动识别所需信息;
💡 低代码/无代码网络爬虫 :进一步完善低代码/无代码网络爬虫平台,让用户通过拖拽和配置的方式生成爬虫;
💡 分布式网络爬虫 :使用分布式技术,同时采集大量网页,提高采集效率;
💡 智能反爬策略应对 :使用AI技术自动识别反爬策略,自动调整采集参数;
💡 合法合规网络爬虫:进一步规范网络爬虫的行为,遵守robots.txt协议和相关法律法规;
🎉 易语言开发从入门到精通的网络爬虫与自动化采集分析系统补充篇·企业级/个人高频数据采集场景全覆盖·电商/新闻/社交平台采集实战,至此结束!愿你在易语言的世界里,不断学习,不断进步,开发出更多"高效、稳定、合法"的网络爬虫系统!
