|
.版本 2
.支持库 spec
.支持库 eAPI
.程序集 窗口程序集_启动窗口
.程序 __启动窗口_创建完毕
调试输出 ("数据抓取程序启动")
抓取网页数据 ()
.程序结束
.子程序 抓取网页数据
.局部变量 URL, 文本型
.局部变量 响应数据, 文本型
.局部变量 所有数据, 文本型, , "100" ' 存储每组数据
.局部变量 组计数, 整数型, 0
' 目标URL
URL = "https://xxxxx.com"
' 发送请求
响应数据 = 发送网页请求 (URL)
.如果 (响应数据 = "") 则
信息框 ("请求失败,无法获取数据", 0, "错误")
返回
.如果结束
' 解析HTML
所有数据 = 解析HTML数据 (响应数据)
' 倒序处理数据
所有数据 = 反转数据组 (所有数据)
' 保存数据到文件
保存数据到文件 (所有数据, "kj_data.txt", 组计数)
信息框 ("一共获取" + 到文本 (组计数) + "期数据" + #换行符 + "数据已成功保存到 kj_data.txt", 0, "完成")
.子程序结束
.子程序 发送网页请求, 文本型
.参数 网址, 文本型
.局部变量 请求头, 文本型
.局部变量 响应字节集, 字节集, , "40960"
' 设置请求头(模拟浏览器)
请求头 = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0 Safari/537.36" + #换行符 +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" + #换行符 +
"Connection: keep-alive" + #换行符 + #换行符
' 发送GET请求
响应字节集 = 网页_访问_对象 (参数1, 0, 请求头, , , , , , , , , , , )
.如果 (取字节集长度 (响应字节集) = 0) 则
返回 ("")
.如果结束
返回 (到文本 (响应字节集, , 假))
.子程序结束
.子程序 解析HTML数据, 文本型, 文本型
.参数 HTML数据, 文本型
.局部变量 解析器, 类_html解析器
.局部变量 kj_boxes, 类_html元素集
.局部变量 当前组数据, 文本型, , "50"
.局部变量 所有组数据, 文本型, , "100"
.局部变量 i, 整数型, 0
.局部变量 j, 整数型, 0
' 初始化解析器
解析器.初始化 (参数1)
' 查找所有 div.kj-box
kj_boxes = 解析器.取标签集 ("div", "class='kj-box'")
.如果 (kj_boxes.取数量 () = 0) 则
返回 ("")
.如果结束
' 遍历每个kj-box
.计次循环首 (kj_boxes.取数量 (), i)
.局部变量 当前Box, 类_html元素
.局部变量 ul元素, 类_html元素
.局部变量 li元素集, 类_html元素集
当前Box = kj_boxes.取元素 (i)
ul元素 = 当前Box.取子标签 ("ul", "class='clearfix'")
.如果 (ul元素.是否有效 () = 假) 则
继续循环
.如果结束
' 查找所有li元素
li元素集 = ul元素.取标签集 ("li")
' 提取dt文本
清空数组 (当前组数据)
.计次循环首 (li元素集.取数量 (), j)
.局部变量 当前Li, 类_html元素
.局部变量 li_class, 文本型
当前Li = li元素集.取元素 (j)
li_class = 当前Li.取属性 ("class")
' 跳过包含kj-jia的li
.如果 (寻找文本 (li_class, "kj-jia") > 0) 则
继续循环
.如果结束
.局部变量 dt元素, 类_html元素
dt元素 = 当前Li.取子标签 ("dt")
.如果 (dt元素.是否有效 () = 真) 则
当前组数据 [取数组成员数 (当前组数据) + 1] = dt元素.取文本 ()
.如果结束
.计次循环尾 ()
' 保存当前组数据
.如果 (取数组成员数 (当前组数据) > 0) 则
所有组数据 [取数组成员数 (所有组数据) + 1] = 连接数组元素 (当前组数据, ", ")
.如果结束
.计次循环尾 ()
返回 (连接数组元素 (所有组数据, #换行符))
.子程序结束
.子程序 反转数据组, 文本型
.参数 数据组, 文本型
.局部变量 数组, 文本型, , "100"
.局部变量 反转数组, 文本型, , "100"
.局部变量 i, 整数型, 0
.局部变量 j, 整数型, 0
' 分割数据组
数组 = 分割文本 (参数1, #换行符)
' 反转数组
j = 取数组成员数 (数组)
.计次循环首 (取数组成员数 (数组), i)
j = j - 1
反转数组 [i] = 数组 [j + 1]
.计次循环尾 ()
返回 (连接数组元素 (反转数组, #换行符))
.子程序结束
.子程序 保存数据到文件
.参数 数据, 文本型
.参数 文件名, 文本型
.参数 组计数, 整数型 参考
.局部变量 数组, 文本型, , "100"
.局部变量 i, 整数型, 0
.局部变量 句柄, 整数型
' 分割数据
数组 = 分割文本 (参数1, #换行符)
组计数 = 取数组成员数 (数组)
' 打开文件
句柄 = 打开文件 (参数2, 4 + 8) ' 读写 + 新建/覆盖
.如果 (句柄 = -1) 则
信息框 ("无法创建文件", 0, "错误")
返回
.如果结束
' 写入数据
.计次循环首 (取数组成员数 (数组), i)
写文件 (句柄, "第" + 到文本 (i) + "组:[" + 数组 [i] + "]" + #换行符)
.计次循环尾 ()
' 关闭文件
关闭文件 (句柄)
.子程序结束
.子程序 连接数组元素, 文本型
.参数 数组, 文本型, , "0"
.参数 分隔符, 文本型
.局部变量 i, 整数型, 0
.局部变量 结果, 文本型
.如果 (取数组成员数 (数组) = 0) 则
返回 ("")
.如果结束
结果 = 数组 [1]
.计次循环首 (取数组成员数 (数组) - 1, i)
结果 = 结果 + 参数2 + 数组 [i + 1]
.计次循环尾 ()
返回 (结果)
.子程序结束
.子程序 清空数组
.参数 数组, 文本型, , "0"
.局部变量 i, 整数型, 0
.计次循环首 (取数组成员数 (数组), i)
数组 [i] = ""
.计次循环尾 ()
.子程序结束
代码功能说明
1. 网页请求模块:
◦ 模拟浏览器请求头(User-Agent)
◦ 使用网页_访问_对象函数发送GET请求
◦ 处理请求失败情况
2. HTML解析模块:
◦ 使用易语言类_html解析器解析HTML
◦ 查找所有div.kj-box元素
◦ 过滤包含kj-jia类的li元素
◦ 提取dt标签内的文本内容
3. 数据处理模块:
◦ 将获取的数据分组存储
◦ 反转数据组顺序
◦ 格式化数据为第X组:[数据1, 数据2, ...]格式
4. 文件保存模块:
◦ 将处理后的数据保存到文本文件
◦ 显示成功保存的提示信息
使用说明
1. 准备工作:
◦ 在易语言中新建Windows窗口程序
◦ 确保勾选"spec"和"eAPI"支持库(工具->支持库配置)
2. 代码修改:
◦ 将URL = "https://xxxxx.com"替换为实际目标网址
3. 编译运行:
◦ 按F7编译程序
◦ 运行后程序会自动抓取数据并保存到同目录下的kj_data.txt
注意事项
1. 易语言的HTML解析功能依赖类_html解析器,需要正确引用支持库
2. 代码中的数组操作需要注意下标从1开始(与Python不同)
3. 网络请求可能因目标网站反爬机制失败,可尝试添加Cookie或延时
4. 若解析结果不正确,需根据实际HTML结构调整选择器参数(如标签名、类名)
此代码实现了Python原代码的所有功能,包括网页请求、HTML解析、数据过滤、反转和文件保存,可直接编译使用。 |
|