易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集


易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集 🕷️🌐📊

1.39.1 学习目标 🎯

作为《易语言开发从入门到精通》的网络爬虫与自动化采集分析系统补充篇·企业级/个人高频数据采集场景全覆盖·电商/新闻/社交平台采集实战 ,本章将帮你构建完整的网络爬虫思维体系,完成3个高实用价值的联合项目,掌握数据采集、解析、存储、反爬的全流程技能,达成以下5重可落地的明确目标:

  1. 构建网络爬虫的五层标准化开发模式:掌握"准备层→采集层→解析层→存储层→部署维护层"的五层标准化开发模式,解决90%以上的网络爬虫需求;
  2. 掌握核心网络爬虫技术:精通常用的HTTP/HTTPS请求(精易模块/WinINet支持库)、HTML解析(正则表达式/HTMLParser支持库)、JSON解析(JSON支持库)、反爬策略应对(代理IP/用户代理池/请求间隔控制);
  3. 开发3个高实用价值的联合项目 :完成京东商城商品价格监控与邮件/钉钉告警系统新浪新闻资讯自动采集与分类存储系统微信公众号文章批量采集与Word/HTML导出系统
  4. 掌握数据存储与导出技术:学会将采集到的数据存储到MySQL/SQLite数据库,导出到Excel/CSV/Word/HTML文件;
  5. 掌握网络爬虫的性能与稳定性优化:学习并发采集(线程池)、代理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协议和相关法律法规;


🎉 易语言开发从入门到精通的网络爬虫与自动化采集分析系统补充篇·企业级/个人高频数据采集场景全覆盖·电商/新闻/社交平台采集实战,至此结束!愿你在易语言的世界里,不断学习,不断进步,开发出更多"高效、稳定、合法"的网络爬虫系统!

相关推荐
ZHOUPUYU28 分钟前
PHP 8.3网关优化:我用JIT将QPS提升300%的真实踩坑录
开发语言·php
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t5 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
赶路人儿6 小时前
Jsoniter(java版本)使用介绍
java·开发语言
ceclar1236 小时前
C++使用format
开发语言·c++·算法
码说AI6 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
老约家的可汗7 小时前
初识C++
开发语言·c++
wait_luky7 小时前
python作业3
开发语言·python